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

7

这让我感到相当困惑。也许我现在太累了。

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

    if (inputArea == null)
        cropArea = rectangle;

inputArea是一个可空的矩形,在我的特定情况下为null。

前两个语句将cropArea初始化为0。然而,第二个语句根据图像的宽度和高度生成了正确的cropArea。我是否误解了条件运算符?当inputArea = null时,它似乎不返回矩形?在使用值类型时有什么怪癖吗?

编辑:好吧,我应该先尝试这个:重新启动VS。似乎调试器骗了我,或者其他什么原因。无论如何,现在可以工作了。谢谢。


我在考虑把这个想法留作提示,告诉其他人重启 VS 可以解决意外问题。您认为呢? - Max
谁他妈的踩了这个问题???这是一个完全有效的问题,揭示了Visual Studio中的一个可怕的bug。 - Darin Dimitrov
顺便提一下,注意在这里你可以使用空值合并运算符而不是条件运算符:croparea = inputArea ?? rectangle; - Eric Lippert
5个回答

1

这似乎是 Visual Studio 调试模式中的一个恶意 bug,它正在愚弄你:

alt text

现在按下 F10 可以跳过这一行并获得以下结果:

alt text

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

什么鬼。


你尝试过使用 Nullable<Rectangle> 吗? - Michael D. Irizarry
@JeremySpouken,针对哪个变量? - Darin Dimitrov
1
@JeremySpouken:这相当于“矩形?”。 - Timwi
有趣。我在VS中输入了相同的代码,无论是DEBUG模式还是RELEASE模式,都得到了正确的值... - Timwi
@HiTech Magic,你了解在.NET中什么是可空类型以及System.Nullable<T>的用途吗?从你的评论中我得到的印象是你不太清楚。我建议你阅读相关文档的章节:http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx - Darin Dimitrov
显示剩余4条评论

0
Rectangle cropArea = (!inputArea.HasValue) ? rectangle : inputArea.Value;

现在为什么要在我的帖子上发垃圾邮件呢 :) @Hitech Rectangle? inputArea = null; Nullable<Rectangle> inputArea2 = null;@TimWi - 现在为什么要踩我呢..我只是想帮助OP? - StuartLC
+1 是因为我在你的帖子上犯了一个错误,引发了一场小的争论。结果发现只有 Silverlight 的 Rectange 类是不可为空的。 - iCollect.it Ltd

0

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

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

应该与以下完全相同:

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

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

通过调试器跟踪并查看是否有任何异常情况。


请不要将条件运算符称为“三元运算符”。 我已经编辑了您的答案以进行更正,希望您不介意。 - Timwi
@Timwi:你现在也需要向jQuery网站投诉了。他们也称其为三元运算符(不同的语言,相同的运算符):) http://learn.jquery.com/javascript-101/conditional-code/ - iCollect.it Ltd

0
那么你的意思是当inputAreanull时,没有if语句,你得到的矩形初始化值不是图像大小吗?我刚试了一下,它可以正常工作。确保image有一个大小,并且inputArea实际上是null

是的,所有这些都看起来非常奇怪,直到我意识到 Visual Studio 欺骗了我。请查看我的编辑。 - Max

-1

什么鬼?

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

if (inputArea == null)
    cropArea = rectangle;

为什么要加第二个if语句?这完全是多余的。cropArea可能仍然为null或零的情况是当inputArea.Value为null/零时,因为您没有检查它(只有在inputArea为null时才检查)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接