2009-06-11 26 views
3

的隱含轉換下面的代碼段不會編譯。隨着以下錯誤:C#:沒有從類<Child>到類<Base>

Cannot implicitly convert type 'Container<ChildClass>' to 'Container<BaseClass>'

class BaseClass {} 
class ChildClass : BaseClass {} 
class Container<T> where T : BaseClass {} 
class Program { 
    static void Main() { 
     // why doesn't this work? 
     Container<BaseClass> obj = new Container<ChildClass>(); 
    } 
} 

設計是這樣嗎?如果是這樣,原因是什麼?

+3

這個問題可以預見每週會出現一次。 – 2009-06-11 14:55:45

+1

...然後Marc Gravell預測告訴大家,C#4中的協變支持是有限的:) – 2009-06-11 14:57:23

+1

那麼它*是*限制的!我厭倦了閱讀「但它會在C#4.0中工作」,這是不正確的......(至少對於列表) – 2009-06-11 14:58:50

回答

14

(由維基中的DUP的情況下)

C#(3.0)不支持列表等的協方差C#4.0將支持有限 [CO |禁忌]方差,但still not lists

的問題是,有:

Container<BaseClass> obj = new Container<ChildClass>(); 

我可以這樣做:

obj.Add(new SomeOtherSubclass()); // SomeOtherSubclass : BaseClass 

這將編譯,但不起作用。

此行爲支持陣列,但主要是出於歷史原因。

0

Cannot implicitly convert type Container<ChildClass> to Container<BaseClass>

有一個很常見的錯誤觀念,從MyClass<Base>MyClass<Child>繼承。

相關問題