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.

确定要调用它吗?