假设我们有一个
之类的接口public interface IEnumerable<out T>
{ /*...*/ }
T
中的 co-variant 。
然后,我们有另一个接口和一个实现的界面:
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
中是共同变化的,因此该分配应起作用(如上所述)。
有什么技术原因为什么这不能以通用方法使用?或我错过的任何东西都使编译器弄清楚它太贵了?
更改您的GenericMethod
并添加通用约束class
:
public void GenericMethod<T>(IEnumerable<T> p) where T : class, ISomeInterface
{
IEnumerable<ISomeInterface> e = p;
// or
TestMethod(p);
}
协方差不支持结构,因此我们需要说我们只使用类。