[英]Generics and Casting
為什么會編譯以下內容?
public IList<T> Deserialize<T>(string xml)
{
if (typeof(T) == typeof(bool))
return (IList<T>)DeserializeBools(xml);
return null;
}
private static IList<bool> DeserializeBool(string xml) { ... do stuff ... }
但這不是
public MyClass<T> GetFromDb<T>(string id)
{
if (typeof(T) == typeof(bool))
return (MyClass<T>)GetBoolValue(id); <-- compiler error here
return null;
}
private static MyClass<bool> GetBoolValue(string id) { ... do stuff ... }
接口起作用的原因是任何對象都可以實現IList<T>
(除非我猜它是密封類型的實例,否則我不會實現)-因此,始終有可能將引用類型轉換為接口。
在后一種情況下,編譯器不願意這樣做,因為盡管有前面的if
語句,但它並不真正知道T
是布爾值,因此它不知道在MyClass<T>
和MyClass<bool>
。 不幸的是,對通用類型的有效轉換非常有限。
您可以很容易地解決它:
return (MyClass<T>)(object) GetBoolValue(id);
它很丑陋,但是應該可以工作……至少在這種情況下,它不會引起任何拳擊。
C#4.0允許在參數化接口和委托類型上聲明協方差和協方差。
如果您更換會怎樣?
return (MyClass<T>)
與
return (MyClass<bool>)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.