C# 一般约束忽略协方差
假设我们有一个像C# 一般约束忽略协方差,c#,generics,covariance,C#,Generics,Covariance,假设我们有一个像 public interface IEnumerable<out T> { /*...*/ } 现在协方差允许我们执行以下操作 IEnumerable<ISomeInterface> e = Enumerable.Empty<SomeClass>(); IEnumerable e=Enumerable.Empty(); 因此,IEnumerable可分配给类型为IEnumerable的变量(或方法参数) 但是,如果我们在通用方法中尝试此
public interface IEnumerable<out T>
{ /*...*/ }
现在协方差允许我们执行以下操作
IEnumerable<ISomeInterface> e = Enumerable.Empty<SomeClass>();
IEnumerable e=Enumerable.Empty();
因此,IEnumerable
可分配给类型为IEnumerable
的变量(或方法参数)
但是,如果我们在通用方法中尝试此方法:
public void GenericMethod<T>(IEnumerable<T> p) where T : ISomeInterface
{
IEnumerable<ISomeInterface> e = p;
// or
TestMethod(p);
}
public void TestMethod(IEnumerable<ISomeInterface> x) {}
public void GenericMethod(IEnumerable p),其中T:isome接口
{
e=p;
//或
试验方法(p);
}
公共void TestMethod(IEnumerable x){}
我们得到编译器错误CS0266告诉我们IEnumerable
不能转换为IEnumerable
约束清楚地表明T
是从isomoInterface
派生出来的,并且由于IEnumerable
在T
中是共变的,因此该赋值应该有效(如上所示)
有没有什么技术上的原因使它不能在通用方法中工作?或者是我遗漏的任何让编译器难以理解的东西?更改
泛型方法,并添加泛型约束类
:
public void GenericMethod<T>(IEnumerable<T> p) where T : class, ISomeInterface
{
IEnumerable<ISomeInterface> e = p;
// or
TestMethod(p);
}
public void GenericMethod(IEnumerable p),其中T:class,接口
{
e=p;
//或
试验方法(p);
}
,所以我们需要告诉大家,我们只想使用类。哦,快告诉我了。现在我记得几天前我读了一些关于结构/差异问题的文章。谢谢您的快速回复。@RenéVogt很乐意帮忙
public void GenericMethod<T>(IEnumerable<T> p) where T : class, ISomeInterface
{
IEnumerable<ISomeInterface> e = p;
// or
TestMethod(p);
}