【问题标题】:C# Generic Class Type parameter (cannot implicitly convert)C# Generic Class Type 参数(不能隐式转换)
【发布时间】:2013-01-22 17:42:15
【问题描述】:

场景:

class A { }

class B : A { }

class C<T> where T: A { }

问题

当 B 是 A 的子类时,为什么不能 C&lt;A&gt; = C&lt;B&gt;? 它抛出“无法隐式转换”错误

谢谢

--更新-- 我可以为C&lt;A&gt; 创建一个可以识别C&lt;B&gt; 的隐式方法吗?

【问题讨论】:

标签: c# generics types parameters implicit-conversion


【解决方案1】:

如果您需要这样做,请使用co-variant,并且因为co-variant 只适用于interface 和delegate,所以使用魔术字@ 定义一个接口987654322@代替类:

interface IC<out T> where T : A
{
}

所以,你可以随意分配:

class CA : IC<A>
{}

class CB : IC<B>
{ }

IC<A> x = new CA();
IC<B> y = new CB();

x = y;

【讨论】:

    【解决方案2】:

    Why cant C&lt;A&gt; = C&lt;B&gt; when B is a subclass of A? BA 的子类,但 C&lt;B&gt; 不是 C&lt;A&gt; 的子类。 C&lt;B&gt;C&lt;A&gt; 之间没有分配兼容性。

    【讨论】:

      【解决方案3】:

      因为C&lt;A&gt; 不是C&lt;B&gt;

      问题是;如果可以的话

      C<A> myA = new C<B>();
      myA.Add(new A());
      

      你有问题,因为B is A,但不是A is B

      【讨论】:

        【解决方案4】:

        您要求的是泛型中的协变和逆变,它仅适用于接口和委托。可以查看this

        您可以在 Framework >= 4 中执行以下操作:

        interface IC<out T> where T : A
        
        class C<T> : IC<T>  where T : A
        
        IC<A> ica = new C<B>();
        

        对于您的情况,您应该为class C 提取一个接口

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-01
          • 2011-01-01
          • 2010-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多