更多信息可在here找到。
out
使得類型參數協變。也就是說,您可以使用該類型或任何派生類型。請注意,out
只適用於泛型,它在方法簽名中使用時有不同的含義(儘管您可能已經知道這一點)。
下面是從referenced page採取的示例:
// Covariant interface.
interface ICovariant<out R> { }
// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }
// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }
class Program
{
static void Test()
{
ICovariant<Object> iobj = new Sample<Object>();
ICovariant<String> istr = new Sample<String>();
// You can assign istr to iobj because
// the ICovariant interface is covariant.
iobj = istr;
}
}
正如可以看到,在接口簽名out
允許 您到ICovariant<String>
分配給ICovariant<Object>
變量,String
從Object
導出。沒有out
關鍵字,您將無法執行此操作,因爲類型會有所不同。
你可以閱讀更多關於協方差(和相關的逆變)here。
至於其他的答案已經指出,IEnumerable
只在.NET 4發協試圖編寫代碼,如:
IEnumerable<Object> strings = new List<string>();
將編譯.NET 4.0和更高版本,而不是在以前的版本。
因爲界面是協變的 – Jodrell
看這裏http://stackoverflow.com/questions/6732299/why-was-ienumerablet-made-covariant-in-c-sharp-4 – Likurg
[Covariance and Contravariance](http:///msdn.microsoft.com/en-us/library/ee207183) – jrummell