none
泛型父类转具体子类 RRS feed

  • 问题

  •         //public interface IBase2<out T>
            //{
            //    T Data { get; set; }
            //}
            public class Base2 : Base2<object>
            {
            }
            public class Base2<T> /*: IBase2<T>*/
            {
                public T Data { get; set; }
            }
            #endregion
            [Fact]
            public void TestBase()
            {
                Base2<object> b = new Base2() {  };
    
                //编译出错
                Base2 bb2 = new Base2<object>() {};
    
                //运行时异常
                Base2 bb = (Base2)new Base2<object>() { Data = 1 };
    
                Assert.NotNull(bb);
            }

    协变和逆变,在属性上有限制,不能同时使用get;set

    有没有好的方法,让泛型父类Base2<object>转成具体子类Base2?



    One world, one dream!

    2017年8月18日 2:32

全部回复

  • Hi,

    感谢你在MSDN论坛发帖。

    >>"  Base2bb2 = new Base2<object>() {}; "

    你能告诉编译器抛出什么样的错误, 根据我对泛型的理解,后面new的时候是一个泛型,那么new出来的对象应该赋值给一个泛型的对象。

    如果你在泛型中使用协变和逆变,通过看CLR代码,你会发现一个关键字out 和 in.

    out 是针对协变,这属性只能被外部使用,只能作为返回值,中途不能修改,那么你就不可能使用set 方法来设置这个变量。

    in 是针对逆变,这个代表是作为输入, 只能作为参数输入,并不能返回,那么就不可以get 它。

    在泛型中使用 协变和逆变,只是对泛型参数进行修饰,并不代表泛型父类和泛型子类的转换,在逆变的时候。

    协变和逆变只是一种约束而已,这种规范限制了你的泛型接口中要么只能有将类型参数当作返回值的协变相容方法(加了 out 关键字),要么只能有将类型参数当作输入值的逆变相容方法(加了 in 关键字)。

    Best Regards,

    Hart

    如果你的问题解决了,请及时标记有用的回复作为答案,这样会帮助遇到相同问题的人。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2017年8月18日 6:53
    版主