【发布时间】:2017-09-27 14:52:38
【问题描述】:
假设我们有一个类似的界面
public interface IEnumerable<out T>
{ /*...*/ }
这是T中的协变体。
然后我们有另一个接口和一个实现它的类:
public interface ISomeInterface {}
public class SomeClass : ISomeInterface
{}
现在协方差允许我们执行以下操作
IEnumerable<ISomeInterface> e = Enumerable.Empty<SomeClass>();
所以IEnumerable<SomeClass> 可分配给IEnumerable<ISomeInterface> 类型的变量(或方法参数)。
但是如果我们在一个通用方法中尝试这个:
public void GenericMethod<T>(IEnumerable<T> p) where T : ISomeInterface
{
IEnumerable<ISomeInterface> e = p;
// or
TestMethod(p);
}
public void TestMethod(IEnumerable<ISomeInterface> x) {}
我们收到编译器错误 CS0266,告诉我们无法将 IEnumerable<T> 转换为 IEnumerable<ISomeInterface>。
约束清楚地表明T 是从ISomeInterface 派生的,并且由于IEnumerable<T> 在T 中是协变的,因此该分配应该有效(如上所示)。
是否有任何技术原因导致这不能在通用方法中工作?或者我错过了什么让编译器无法计算出来的成本太高?
【问题讨论】:
标签: c# generics covariance