none
C# 范型bug : 不能完整判定有继承关系的范型类 RRS feed

  • 问题

  •     //明确声明T是class
        class AA<T> where T:class
        {
          //明确证明K是T的子类,或K继承与T
          public void fun<K>( K _objK ) where K : T
          {
            //将子类对象赋给父类对象,OK!
            T objT = _objK as T;
    
            //ERROR: The type parameter 'K' cannot be used with the 'as' operator 
            //because it does not have a class type constraint nor a 'class' constraint
            _objK = objT as K; //TNND 竟然说K不能用as,理由是K不是class ??!! 那K:T又是什么!!
          }//fun<K>
        }//AA<T>
    
    2011年3月2日 14:45

答案

  • 这个,只能说是一个编译原则,class是关键字,不是类型,所以class只能描述对T的约束,但K继承自T,这是一个约束,但class是关键字,不是类型,所以不存在语义上的继承具有类特性,所以还是需要写一次class的约束。

    这样就可以了

     

    //明确声明T是class
    class AA<T> where T : class
    {
     //明确证明K是T的子类,或K继承与T
     public void fun<K>(K _objK) where K : class,T
     {
      //将子类对象赋给父类对象,OK!
      T objT = _objK as T;
    
      //ERROR: The type parameter 'K' cannot be used with the 'as' operator 
      //because it does not have a class type constraint nor a 'class' constraint
      _objK = objT as K; //TNND 竟然说K不能用as,理由是K不是class ??!! 那K:T又是什么!!
     }//fun<K>
    }//AA<T>
    

     

    简单说,继承是发生在类之间的,编译时的约束无法通过继承实现,换句话说,继承是运行时的状态,约束是编译时的限制。

     


    2011 c# mvp China
    2011年3月3日 1:35
    版主