当前位置:  开发笔记 > 编程语言 > 正文

编译器无法转换受约束的泛型类型

如何解决《编译器无法转换受约束的泛型类型》经验,为你挑选了1个好方法。

我有一个通用类型为"G"的类

在我的班级模型中,我有

public class DetailElement : ElementDefinition

假设我有这样的方法

        public void DoSomething(G generic)
            where G : ElementDefinition
        {
            if (generic is DetailElement)
            {
                ((DetailElement)generic).DescEN = "Hello people"; //line 1
                //////
                ElementDefinition element = generic;
                ((DetailElement)element).DescEN = "Hello again"; //line 3
                //////
                (generic as DetailElement).DescEN = "Howdy"; //line 5
            }
            else
            {
                //do other stuff
            }
        }

编译器报告第1行中的一个错误:

Cannot convert type 'G' to 'DetailElement'

但第3行工作正常.我可以通过执行第5行编写的代码解决此问题.

我想知道的是,为什么编译器报告第1行中的错误而不是第3行中的错误,因为据我所知,它们是相同的.

编辑:恐怕我可能会遗漏一些重要的框架逻辑

edit2:虽然编译器错误的解决方案很重要,但我的问题是编译器为什么在第1行而不是第3行报告错误.



1> Mark Cidade..:

如果G被约束为a DetailElement(where G : DetailElement),则可以继续并转换G为ElementDefinition,即" (ElementDefinition) generic".但是因为G可能是运行时ElementDefinition以外的另一个子类,DetailElement所以在编译时它不会允许它在类型未知且无法验证的情况下.

在3号线从投的类型已知的ElementDefinition,因此所有你正在做的是上投.编译器不知道它是否会在运行时成为一个succcesful演员,但它会相信你.编译器不太相信泛型.

as5行中的运算符也可能返回null,并且编译器不会静态检查类型以查看在这种情况下它是否安全.您可以使用as任何类型的,不只是那些与兼容ElementDefinition.

我可以转换为通用类型参数吗?在MSDN上:

编译器只允许您将泛型类型参数隐式转换为对象或约束指定的类型.

这种隐式转换当然是类型安全的,因为在编译时会发现任何不兼容性.

编译器将允许您将泛型类型参数显式转换为任何接口,但不能转发给类:

   interface ISomeInterface {...}
   class SomeClass {...}
   class MyClass 
    {
      void SomeMethod(T t)
       {
         ISomeInterface obj1 = (ISomeInterface)t;//Compiles
         SomeClass      obj2 = (SomeClass)t;     //Does not compile
       }
    }

但是,您可以使用临时对象变量强制从泛型类型参数转换为任何其他类型

 void SomeMethod(T t) 
  { object temp = t;
    MyOtherClass obj = (MyOtherClass)temp;  
  }

毋庸置疑,这种显式转换很危险,因为如果使用的具体类型而不是泛型类型参数不是从您明确转换为的类型派生的,那么它可能会在运行时抛出异常.

而不是冒着铸造异常的风险,更好的方法是使用isas运算符.该is运营商如果泛型类型参数是查询的类型,并返回true as,如果类型兼容将执行强制类型转换,并且将空否则返回.

public void SomeMethod(T t)
 {
   if(t is int) {...}

   string str = t as string;
   if(str != null) {...}
 }

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有