本文介绍了编译器无法转换约束泛型类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有了一个通用型的G类
在我的类模型,我有
公共类DetailElement:ElementDefinition
让我们说我有一个方法像这样
公共无效DoSomething的< G>(G通用)
其中G:ElementDefinition
{
如果(一般为DetailElement)
{
((DetailElement)通用).DescEN =你好的人; //行1
//////
ElementDefinition元=通用的;
((DetailElement)元素).DescEN =你好再次 // 3号线
//////
(一般为DetailElement).DescEN =你好; // 5号线
}
,否则
{
//做其他的东西
}
}
编译器在第1行报告有一个错误:
无法转化型'G'到'DetailElement'
不过,3号线工程的罚款。
我可以做写在第5行代码解决此问题。
我想知道的是为什么编译器报告错误在第1行,而不是因为,据我所知,他们是相同的一个在3号线,
编辑:恐怕我可能失踪的框架逻辑的一些重要的一块。
EDIT2:虽然编译器错误的解决方案是很重要的,我的问题是关于为什么编译器第1行,而不是报告错误在第3行。
解决方案
如果被限制为一个 DetailElement
(其中G:DetailElement
),那么你可以继续投来ElementDefinition,即(ElementDefinition)通用
。但由于可能是另一个子 ElementDefinition
比 DetailElement
在运行时也不会允许它在编译时其中类型是未知的,无法证实的。
在第3行你投的类型是的已知的 ElementDefinition
因此,所有你正在做的是上投。编译器不知道这是否会在运行时一个投succcesful但它会出现信任你。编译器并非如此信任的仿制药。
的
的 为
的运营商在第5行也可能返回null,编译器不静态检查,看看它是否在这种情况下的安全类型。您可以使用为
与的的类型,而不仅仅是那些与 ElementDefinition
兼容。
从的的 的MSDN上:
这篇关于编译器无法转换约束泛型类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!