代码之家  ›  专栏  ›  技术社区  ›  Doug Conyers

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

  •  4
  • Doug Conyers  · 技术社区  · 9 年前

    “派生类型列表” 对于需要 .我可以欣赏动物的例子,并且觉得我在学习之后有了更好的理解。

    “测试接口的通用类” 在集合中。我已经在下面复制/粘贴了我的最大努力,这似乎是完成任务的最佳方式。

    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:无法从“协方差”转换。“GenericClass”改为“协方差.GenericClass”

    错误CS1503:参数1:无法从“协方差”转换。“GenericClass”改为“协方差.GenericClass”

    任何帮助/指导或相关链接将不胜感激。如果这是一个重复的问题,我再次表示歉意。非常感谢。

    1 回复  |  直到 9 年前
        1
  •  4
  •   Evk    9 年前

    只能在泛型接口上声明差异修饰符(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>());
        }
    }
    
    推荐文章