Warning as Error: Possible unintended reference comparison when upgrading from .Net 3.5 to .Net 4.5
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
return 是 IInputElement
类型的值。所以条件(忽略第一部分)可以改写为:
IInputElement element = typedSender.InputHitTest(e.GetPosition(typedSender));
Type type = typedSender.GetType();
if (element != type)
{
...
}
两个引用可能相等的唯一方式是,如果它们都是null
,而typedSender.GetType()
永远不会return null
,所以这个条件没有意义。
你现在比较作为命中测试结果的输入元素是否与typedSender
属于同一类型,这至少是有道理的-虽然它不检查它 是 typedSender
.
值得注意的是documentation for InputHitTest
包括:
This method typically is not called from your application code. Calling this method is only appropriate if you intend to re-implement a substantial amount of the low level input features that are already present, such as recreating mouse device logic.
你确定要调用它吗?
目前我正在将 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
return 是 IInputElement
类型的值。所以条件(忽略第一部分)可以改写为:
IInputElement element = typedSender.InputHitTest(e.GetPosition(typedSender));
Type type = typedSender.GetType();
if (element != type)
{
...
}
两个引用可能相等的唯一方式是,如果它们都是null
,而typedSender.GetType()
永远不会return null
,所以这个条件没有意义。
你现在比较作为命中测试结果的输入元素是否与typedSender
属于同一类型,这至少是有道理的-虽然它不检查它 是 typedSender
.
值得注意的是documentation for InputHitTest
包括:
This method typically is not called from your application code. Calling this method is only appropriate if you intend to re-implement a substantial amount of the low level input features that are already present, such as recreating mouse device logic.
你确定要调用它吗?