簡體   English   中英

泛型和強制轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM