Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一般约束忽略协方差_C#_Generics_Covariance - Fatal编程技术网

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);
}