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

时间:2010-08-29 11:57:32

标签: c# .net conditional-operator nullable value-type

这让我非常难过。也许我现在太累了。

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

    if (inputArea == null)
        cropArea = rectangle;

inputArea是一个可以为null的Rectangle,在我的特定情况下为null。

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

编辑:好吧,我应该先试试这个:重启VS.似乎调试器骗了我,或者其他东西。无论如何,现在工作。感谢。

5 个答案:

答案 0 :(得分:1)

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

alt text

现在 F10 跳过这一行,你得到:

alt text

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

WTF。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的代码显示正确无误。条件表达式(或条件运算符,或最初称为三元运算符 ...现在每个人都快乐?:))应该可以与if / else语句互换。

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

应与:

完全相同
Rectangle cropArea;
if (inputArea == null)
{
    cropArea = rectangle;
}
else
{
    cropArea = inputArea.Value;
}

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

使用调试器进行跟踪,看看是否有任何事情发生。

答案 3 :(得分:0)

您是说当inputAreanull时,如果没有if语句,您会将矩形初始化为图像大小以外的其他内容?我只是尝试运行它,它工作正常。确保image的大小与inputArea实际为null

答案 4 :(得分:-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 / 0,因为您没有检查(仅当inputArea为null)。