我不清楚为什么下面的代码片段不是协变的?
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?
}
我的界面只在输出位置使用模板参数。我可以轻松地将此代码重构为类似
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 协方差的限制。
最佳答案
问题确实在这里:
bool TryGetValue( string SUID, out T obj ); // Error here?
您将 obj 标记为
out
参数,这仍然意味着尽管您传入的是 obj
,因此它不能是协变的,因为您都传入了 T
类型的实例并返回了它。编辑:
埃里克·利珀特 (Eric Lippert) 说得比我提到的 his answer to "ref and out parameters in C# and cannot be marked as variant" 和引用他的关于
out
参数的任何人都好:关于c# - 为什么 C# out 泛型类型参数违反协方差?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8913814/