c# - 我已经阅读了所有有关协方差,协方差和不变性的文章,但是我仍然不知道如何设计代码

在发布这篇文章之前,我已经尽可能多地进行了搜索和阅读/研究。我发现了类似的问题,但大多数帖子实际上更多地涉及到将“派生类型列表”传递给需要“基类型列表”的函数调用。我能欣赏动物的例子,并觉得我有一个更好的掌握后,我的研究。
尽管如此,我仍然不知道如何解决我的特定用例。我需要在集合中聚合“TestInterface的GenericClass”的实例。我已经尽了最大的努力在下面复制/粘贴了看起来是完成任务的最佳方式的内容。

namespace Covariance
{
    class Program
    {

        protected static ISet<GenericClass<TestInterface>> set = new HashSet<GenericClass<TestInterface>>();

        static void Main(string[] args)
        {
            set.Add(new GenericClass<A>());
            set.Add(new GenericClass<B>());
        }
    }

    class GenericClass<TemplateClass> where TemplateClass : TestInterface
    {
        TemplateClass goo;
    }

    public interface TestInterface
    {
        void test();
    }
    public class A : TestInterface
    {
        public void test()
        {
        }
    }

    class B : A
    {
    }
}

上述代码失败,并出现以下编译错误:
错误CS1503:参数1:无法从“covariance.genericClass”转换为“covariance.genericClass”
错误CS1503:参数1:无法从“covariance.genericClass”转换为“covariance.genericClass”
任何帮助/指导或相关链接将不胜感激。如果这是个重复的问题,我再次道歉。谢谢您!

最佳答案

只能在泛型接口上声明差异修饰符(in,out),而不能声明类型。所以解决这个问题的一个方法是为GenericClass声明接口,如下所示:

interface IGenericClass<out TemplateClass> where TemplateClass : TestInterface {
    TemplateClass goo { get; }
}
class GenericClass<TemplateClass> : IGenericClass<TemplateClass> where TemplateClass : TestInterface
{
    public TemplateClass goo { get; }
}

然后
class Program {
    protected static ISet<IGenericClass<TestInterface>> set = new HashSet<IGenericClass<TestInterface>>();

    static void Main(string[] args) {
        set.Add(new GenericClass<A>());
        set.Add(new GenericClass<B>());
    }
}

本文翻译自 https://stackoverflow.com/questions/40758996/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# generics covariance nested-generics invariance


相关文章:

c# - 在C#中,为什么List <string>对象不能存储在List <object>变量中

c# - 实体框架查询多对多关系

c# - 波斯日历不适用于CultureInfo

java - 仅在运行时知道通用类型时如何指定通用类型?

node.js - @UsePipes(ValidationPipe)不适用于泛型(抽象控制器)

c# - 多次实现协变接口:此行为是否已正确定义?

c# - 在服务器端获取唯一的会话ID /密钥

c# - 无法访问Newtonsoft.Json.Linq.JProperty上的子值-使用LinQ检查JObject时发生错误

c# - 结构图和通用类型

java - 如何通过将单个数组与Stream串联来实例化String数组的Stream