我已经阅读了所有关于协方差,逆变和不变性的信息,但我仍然不知道如何设计我的代码



在发布此信息之前,我搜索和阅读/研究似乎是合理的。我发现了类似的问题,但是大多数帖子实际上与将"派生类型的列表"相关联, call需要"基本类型的列表" 。我可以欣赏动物的例子,并觉得我学业后有更好的掌握。

话虽如此,我仍然不知道如何在我的特定用例中解决。我需要在集合中汇总a " testInterface(s)的通用类"的实例。我在最大的努力下复制/粘贴了完成任务的最佳方法。

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:无法从'orvariance.genericClass'转换为'orvariance.genericClass'

错误CS1503:参数1:无法从'orvariance.genericClass'转换为'orvariance.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>());
    }
}

相关内容

  • 没有找到相关文章

最新更新