.Net 中条件运算符的奇怪行为

Posted

技术标签:

【中文标题】.Net 中条件运算符的奇怪行为【英文标题】:Weird behaviour with conditional operator in .Net 【发布时间】:2011-04-05 09:49:30 【问题描述】:

这让我很困惑。也许我现在太累了。

    Rectangle rectangle = new Rectangle(0, 0, image.Width, image.Height);
    Rectangle cropArea = inputArea == null ? rectangle : inputArea.Value;

    if (inputArea == null)
        cropArea = rectangle;

inputArea 是一个可为空的 Rectangle,在我的特殊情况下为空。

前两个语句产生一个初始化为 0 的cropArea。然而,第二个语句根据图像的宽度和高度产生正确的cropArea。我对条件运算符有什么误解吗? inputArea = null 时似乎不返回矩形?使用值类型时有什么奇怪的地方吗?

编辑:好的,我应该先尝试一下:重新启动 VS。似乎调试器对我撒了谎,或者其他什么。无论如何,现在工作。谢谢。

【问题讨论】:

我想把它作为一个提示给其他人,重启 VS 总能解决意想不到的问题。你怎么看? 谁他妈否决了这个问题???这是一个完全有效的问题,暴露了 Visual Studio 中的一个可怕的错误。 顺便说一句,请注意您可以在此处使用空合并运算符而不是条件运算符:croparea = inputArea ??矩形; 【参考方案1】:

这似乎是 Visual Studio 调试模式中的一个讨厌的错误,它正在愚弄你:

现在 F10 越过这条线,你会得到:

在控制台上打印正确的值。

WTF.

【讨论】:

你试过 Nullable @JeremySpouken,对于哪个变量? @JeremySpouken:相当于Rectangle? 有趣。我在 VS 中输入了相同的代码,得到了正确的值(在 DEBUG 和 RELEASE 模式下)... @Timwi,您使用的 VS 和操作系统的确切版本号是多少?对我来说,它是在 Windows 7 x64 上运行的 10.0.30319.1 RTMRel【参考方案2】:
Rectangle cropArea = (!inputArea.HasValue) ? rectangle : inputArea.Value;

【讨论】:

现在为什么 my 线程上的垃圾邮件 :) @Hitech Rectangle?输入区域=空; Nullable inputArea2 = null; @TimWi - 现在为什么不赞成..只是想帮助 OP? +1 因为我在你的帖子上犯了一个错误并开始了一场小型的火焰战争。原来只有 Silverlight Rectange 类不可为空。【参考方案3】:

所以你是说当inputAreanull 时,如果没有if 语句,你会得到一个初始化为图像大小以外的矩形?我刚刚尝试运行它,它工作正常。确保image 具有大小,并且inputArea 实际上是null

【讨论】:

是的,所有这些看起来都很奇怪,直到我意识到视觉工作室对我撒了谎。查看我的编辑。【参考方案4】:

您的代码显示正确。条件表达式(或条件运算符,或最初称为三元运算符...现在大家开心吗?:))应该可以与 if/else 语句互换。

Rectangle cropArea = inputArea == null ? rectangle : inputArea.Value;

应该完全一样:

Rectangle cropArea;
if (inputArea == null)

    cropArea = rectangle;

else

    cropArea = inputArea.Value;

(实际上它们应该生成相同的 IL 代码)。

使用调试器进行跟踪,看看是否有任何问题。

【讨论】:

请不要将条件运算符称为“三元运算符”。我已编辑您的答案以更正此问题,希望您不要介意。 @Timwi:你现在也需要向 jQuery 网站投诉。他们也称它为三元运算符(不同的语言,相同的运算符):) learn.jquery.com/javascript-101/conditional-code【参考方案5】:

什么鬼?

Rectangle rectangle = ...;
Rectangle cropArea;
if (inputArea == null)
    cropArea = rectangle;
else
    cropArea = inputArea.Value;

if (inputArea == null)
    cropArea = rectangle;

为什么要有第二个 if?这是完全和完全多余的。如果 inputArea.Value 为 null/0,cropArea 可能仍为 null 或零的情况,因为您没有检查(仅当 inputArea 为 null 时)。

【讨论】:

以上是关于.Net 中条件运算符的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

Shell中条件判断语法与判断条件

React中条件渲染和循环

thinkphp3.2 where 条件查询

thinkphp3.2 where 条件查询

17.自学Linux之路:bash编程之条件判断语句

如何快速在labview中条件结构中添加大量分支(例如100个不同分支)?(不要用默认分支。。)