目前,我正在将.Net Framework 3.5中的WPF应用程序迁移到.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年。
答案 0 :(得分:2)
你以前的代码基本上已经破了。你说它有效,但我看不出这种情况会是错误的。我怀疑编译器现在比以前更聪明。条件是:
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
。
值得注意的是documentation for InputHitTest
包括:
通常不会从应用程序代码中调用此方法。只有在打算重新实现已经存在的大量低级输入功能时才调用此方法,例如重新创建鼠标设备逻辑。
你确定你要打电话吗?