小编Jak*_*kub的帖子

C# IEnumerable<T> 中的协变/逆变,其中 T 是泛型类型、接口与类

有人理解为什么类的泛型约束与接口不同吗?此代码无法编译:

public interface IInterface
{
}

public class Class<T> where T : IInterface
{
    public void Do()
    {
        IEnumerable<IInterface> ret = GetEnumerable();
    }

    public IEnumerable<T> GetEnumerable()
    {
        return new T[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,通过将 IInterface 更改为类,突然可以编译

public class IInterface
{
}

public class Class<T> where T : IInterface
{
    public void Do()
    {
        IEnumerable<IInterface> ret = GetEnumerable();
    }

    public IEnumerable<T> GetEnumerable()
    {
        return new T[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用:

IEnumerable<IInterface> ret = (IEnumerable<IInterface>)GetEnumerable();
Run Code Online (Sandbox Code Playgroud)

但我真的很想知道如果 IInterface 是接口,为什么需要强制转换。

c# generics interface covariance

5
推荐指数
1
解决办法
280
查看次数

标签 统计

c# ×1

covariance ×1

generics ×1

interface ×1