[英]Warning as Error: Possible unintended reference comparison when upgrading from .Net 3.5 to .Net 4.5
目前,我正在将WPF应用程序从.Net Framework 3.5迁移到.Net Framework 4.5。 .Net Framework升级之后,应用程序现在将编译为64位而不是32位。 编译应用程序时出现以下错误:
警告为错误:可能会进行意外的参考比较; 要进行值比较,请将左侧的文字键入“ System.Type”
我的问题是:既然我已经升级到.Net 4.5,而从未在.Net 3.5上升级,为什么会出现此错误? 我没有对项目的构建属性进行任何更改,都将“ Treat warnings as errors
设置设置为All
。 下面是产生错误的代码,我添加了一些有关所做更改的注释,未注释的部分在.Net 4.5下编译。
private void FoldersListBoxMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
// Get typed sender
ListBox typedSender = sender as ListBox;
if (typedSender != null)
{
// Check if an item was double clicked
//The line below worked in .Net 3.5, but not in .Net 4.5
//if ((typedSender.SelectedItem != null) && (typedSender.InputHitTest(e.GetPosition(typedSender)) != typedSender.GetType()))
//And this is the line that I have changed (I added GetType()!).
if ((typedSender.SelectedItem != null) && (typedSender.InputHitTest(e.GetPosition(typedSender)).GetType() != typedSender.GetType()))
{
// Yes, set the new path
SelectedPath = typedSender.SelectedValue as string;
}
}
}
编辑:我已经在将此代码添加到应用程序中时进行了查找,但无法找到它,因为Subversion存储库仅可追溯到6年。
基本上,您先前的代码已损坏。 您说它有效,但是我看不到该条件永远是错误的。 我怀疑编译器现在比以前更聪明。 条件是:
typedSender.InputHitTest(e.GetPosition(typedSender)) != typedSender.GetType()
现在, InputHitTest
返回一个IInputElement
类型的值。 因此条件(忽略第一部分)可以重写为:
IInputElement element = typedSender.InputHitTest(e.GetPosition(typedSender));
Type type = typedSender.GetType();
if (element != type)
{
...
}
这两个引用相等的唯一方法是,如果它们都为null
,并且typedSender.GetType()
永远不会返回null
,那么条件是毫无意义的。
现在,您正在比较命中测试结果的输入元素是否与typedSender
相同类型,这至少是有道理的-尽管它不会检查它是否为 typedSender
。
值得注意的是, InputHitTest
的文档包括:
通常不会从您的应用程序代码中调用此方法。 仅当您打算重新实现大量已经存在的低级输入功能(例如重新创建鼠标设备逻辑)时,才调用此方法是适当的。
您确定要打电话吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.