.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.
【讨论】:
你试过 NullableRectangle?
。
有趣。我在 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】:所以你是说当inputArea
是null
时,如果没有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 中条件运算符的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章