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# - ASP.NET Identity 3 cookie 身份验证未按预期工作

java - Factory设计的实现,在Spring Boot中遇到这个错误

c++ - C++ 中灵活的应用程序配置

android - 如何在 Roboguice 中通过构造函数注入(inject)参数? [安卓]

Java Bounded 类型参数错误

java - 与 lambda 和功能接口(interface)一起使用时理解下限的问题

c# - 为网络服务动态构建数组

C#:如何在 ListView 中编辑项目和子项目?

c# - ASP Core Razor 页面在发布时更改 BindProperty 值

c# - 获取所有使用特定泛型类实现类的类