2010-05-27 71 views
3

可能重複:
Why isn’t there generic variance for classes in C# 4.0?爲什麼.NET 4中的類不是協變的?

作爲新人程序員,我有一對夫婦約方差.NET 4與其說它是如何工作的,問題偏偏有些事情是不是變體,如果其他人會覺得這有用。

問題1:

我知道,接口和委託可協變/逆變.NET 4的,但爲什麼不類?所以,問題1:

List(of BaseClass) = List(of DerivedClass) 

這是不是安全嗎?這不會有用嗎?


問題2:

問題2從問題1以下,但可能與簽名不是方差成交多。假設我有一個爲MustInherit類與MustOverride成員:

Public MustInherit Class TestBase 
    Public MustOverride Property SomeClass as BaseClass 
End Class 

在派生類中,我爲什麼不能覆蓋SomeClass的,並返回一個派生類BaseClass的?這是不安全的嗎?只是簽名不檢查繼承關係嗎?

Public Class TestSpecific 
    Inherits TestBase 
    Public Overrides Property SomeClass as DerivedClass 
End Class 

任何有關爲什麼這是不允許在.NET 4的洞察力,將不勝感激。

+0

要回答你的第二個問題(因爲問題在我回答時已經關閉):你可以通過向基類添加一些泛型來做到這一點。例如,Java Enums使用它來確保'compareTo'只能傳遞該枚舉的值。見[這裏](http://madbean.com/2004/mb2004-3/)和[這裏](http://msmvps.com/blogs/jon_skeet/archive/2008/08/20/lessons-learned-from -protocol緩衝器部分-2-自引用泛型-types.aspx)。 – 2010-05-27 14:58:29

回答

4

Eric Lippert answers the first part of you question here

至於你的第二部分問題,C#和VB.NET都要求返回類型的協方差 - 但是它還沒有被優先考慮到與其他語言特性相比足夠高的優先級,以使它成爲任何發佈版本。如果我沒有記錯,這個功能還需要對CLR進行更改才能正確實施。

至於爲什麼會這樣,我會給Eric Lippert片刻片刻,並回應說沒有實現一個功能是免費的,而實現功能需要預算和時間來設計,開發,測試和記錄它。 ..這不是免費的。一項功能必須足夠有價值,足以證明創建它的費用是合理的。

+0

謝謝,閱讀他的帖子。我很困惑,爲什麼泛型參數不能有任何「可寫」字段/屬性。有沒有一個這樣會導致問題的例子?回去深入研究他的例子... – 2010-05-27 14:50:11

+2

不能說更好的我自己。 :-) – 2010-05-29 04:22:04

+1

@Casey:假設C 在T中是協變的,而C 有一個方法void M(T t)。你有一個C型變量x 。將類型C 的值轉換爲C 並將其分配給x。現在你可以調用x.M(new Giraffe()),因爲據編譯器知道,M需要一個對象,而不是老虎。然後,當它試圖將長頸鹿轉換爲老虎時,運行時崩潰。這就是爲什麼一個協變類型有一個T進入「in」是非法的。 – 2010-05-29 04:25:42

相關問題