c# - 为什么我会收到 "The type parameter must be invariantly valid..."错误?

标签 c# generics factory-pattern variant

我将尝试缩短此代码示例:

public interface IThing
{
    //...  Stuff
}

public class Thing1 : IThing
{  
}

public class Thing2 : IThing
{  
}

public interface IThingView<out T>
{
    ICollection<T> ViewAll();
}

public class ThingView<T> : IThingView<T>
{
    ICollection<T> ViewAll() { return new List<T>(); }  //  There's a big operation here
}

public interface IThingViewerFactory
{
    public IThingView<IThing> Build(string Which);
}

public class ThingViewerFactory
{
    public IThingView<IThing> Build(string Which)
    {
        if(Which.Equals("Thing1") { return new (IThingView<IThing>)new ThingViewer<Thing1>();}
        else { return new (IThingView<IThing>)new ThingViewer<Thing2>();}
    }
}

这就是我在做什么的粗略想法。我有许多需要查看器的 Thing 类,它们将遵循一个通用接口(interface)。我希望工厂通过我传入一个带有名称的字符串来生成这些。我不断收到编译器错误提示:

无效方差:类型参数“T”必须在“IThingView.ViewAll()”上始终有效。 'T' 是协变的。

我意识到即使我让它工作,之后我也必须做一些转换……我对此没意见。我意识到这种方法很可能没有必要。在这一点上,这更像是一个骄傲/好奇的问题。

谢谢!

最佳答案

你不能做一个协变ICollection<T> , 因为它允许你把 T进入它。

您可以创建协变只读集合、逆变只写集合或不变读写集合。
你不能两者都做,否则它就不是类型安全的。

关于c# - 为什么我会收到 "The type parameter must be invariantly valid..."错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6142747/

相关文章:

c# - 内存快照触发dotMemory中的Garbage collection

ios - Swift 中的闭包数组

泛型:类型应该对另一种类型进行操作,而是对声明的文字值进行操作?

Java泛型类型参数混淆

c++ - boost::序列化和工厂模式设计

delphi - 从 TObject 转换为接口(interface)类型

Java Pattern 类没有公共(public)构造函数,为什么?

c# - 将 System.Array 的 C# 十进制值转换为字符串

c# - 如何在 Asp.Net Core 2.0 中实例化 UrlHelper 进行 Controller 单元测试

c# - 如何使 ASP.NET Core void/Task 操作方法返回 204 No Content