警告为错误:从.Net 3.5升级到.Net 4.5时可能出现意外的参考比较

时间:2015-01-27 13:15:50

标签: c# reference .net-3.5 comparison .net-4.5

目前,我正在将.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年。

1 个答案:

答案 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)
{
    ...
}

两个引用可能相同的唯一方式是nulltypedSender.GetType()永远不会返回null,所以条件毫无意义。

现在比较作为命中测试结果的输入元素是否与typedSender具有相同的类型,这至少是有意义的 - 尽管它不是检查 typedSender

值得注意的是documentation for InputHitTest包括:

  

通常不会从应用程序代码中调用此方法。只有在打算重新实现已经存在的大量低级输入功能时才调用此方法,例如重新创建鼠标设备逻辑。

确定你要打电话吗?