我不清楚爲什麼下面的代碼段不是covarient?爲什麼C#out泛型類型參數違反協方差?
public interface IResourceColl<out T> : IEnumerable<T> where T : IResource {
int Count { get; }
T this[int index] { get; }
bool TryGetValue(string SUID, out T obj); // Error here?
}
錯誤1無效方差:類型參數 'T' 必須是 'IResourceColl.TryGetValue(字符串,出T)' 不變地 有效。 'T'是 covariant。
我的界面只在輸出位置使用模板參數。我可以很容易地重構這個代碼,以類似
public interface IResourceColl<out T> : IEnumerable<T> where T : class, IResource {
int Count { get; }
T this[int index] { get; }
T TryGetValue(string SUID); // return null if not found
}
,但我想了解,如果我原來的代碼實際上違反了協方差或者如果這是協方差的編譯器或.NET的限制。
的可能重複[C#:爲什麼不呢?做「裁判」和「出」支持多態性(HTTP://計算器。 COM /問題/ 1207144/C鋒利爲什麼-犯規,裁判和出支持多態) – Jon 2012-01-18 16:43:37
這裏要注意的重要一點是,['out'](http://msdn.microsoft.com/en -us /庫/ ee332485.aspx)(參數改性劑)是完全無關的(http://msdn.microsoft.com/en-us/library/dd469487.aspx)(使用[out'']在通用型參數)。 – Jon 2012-01-18 16:44:50
@Jon - 這個問題適用於C#3.0和之前的版本。這裏描述的語法是C#4.0 – Oded 2012-01-18 16:44:57