繁体   English   中英

从错误警告:从.Net 3.5升级到.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返回一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM