2012-08-10 35 views
4

可能重複:
Why isn't there generic variance for classes in C# 4.0?爲什麼不能將OUT通用修飾符應用於類以及接口?

實施例:

interface foo<out T> where T : BaseThing { } 

編譯

class foo<out T> where T : BaseThing { } 

沒有。

這僅僅是不被支持,或者有一些原因,爲什麼它永遠不會工作或不合邏輯?

編輯:這就是我想要做的,以防有人想知道...

 class BaseThing { } 
     class DerivedThing : BaseThing { } 

     class foo<out T> where T : BaseThing { } 
     class bar : foo<DerivedThing> { } 

     private void test() 
     { 
      foo<BaseThing> fooInstance = new bar(); 
     } 
+0

那麼,[文檔](http://msdn.microsoft.com/en-us/library/dd469487)說'out'只支持接口和委託。至於爲什麼這樣設計,我相信Eric Lippert最終會看到這個問題並給你一個全面的答案(沒有足夠的用例,或者所有的用例都不常見......)。 – Oded 2012-08-10 19:04:38

回答

3

out修飾符告訴編譯器的類型參數可以是協變的。這意味着T類型的使用可能更多派生。由於您使用的是特定的類(例如構造的泛型類型),因此只有一個具體類型的實例,因此不存在更多派生類型。多種類型可以實現像foo這樣的接口,這意味着你正在處理潛在的不同類型的T,在這種情況下,這些T類型中的一個可能更多派生。

相關問題