通用约束忽略了共同变异



假设我们有一个

之类的接口
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);
}

协方差不支持结构,因此我们需要说我们只使用类。

相关内容

  • 没有找到相关文章

最新更新