Weird behaviour with conditional operator in .Net

This has me pretty stumped. Maybe I'm too tired right now.

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

    if (inputArea == null)
        cropArea = rectangle;

inputArea is a nullable Rectangle, which in my particular case is null.

The first two statements yields a cropArea initialized to 0. The second, however, yields the correct cropArea based on the image width and height. Have I misunderstood anything with the conditional operator? It seems it does not return rectangle when inputArea = null? Is there any quirks when working with value types?

EDIT: Alright, I should have tried this first: restarted VS. It seems the debugger lied to me, or something. Anyway, works now. Thanks.

7
задан Timwi 29 August 2010 в 15:55
поделиться

4 ответа

Rectangle cropArea = (!inputArea.HasValue) ? rectangle : inputArea.Value;
0
ответ дан 8 December 2019 в 01:41
поделиться

Значит, вы говорите, что когда inputArea равно null, без оператора if вы получаете прямоугольник, инициализированный чем-то другим, кроме размера изображения? Я только что попробовал запустить это, и это работает нормально. Убедитесь, что изображение имеет размер и что inputArea на самом деле нуль.

0
ответ дан 8 December 2019 в 01:41
поделиться

Ваш код кажется правильным. Условное выражение (или условный оператор, или первоначально называвшееся тернарным оператором... теперь все довольны? :)) должно быть взаимозаменяемо с операторами if/else.

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

должны быть точно такими же, как:

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

(на самом деле они должны генерировать один и тот же код IL).

Проследите с помощью отладчика и посмотрите, не выскочит ли что-нибудь.

0
ответ дан 8 December 2019 в 01:41
поделиться

Какого черта?

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

if (inputArea == null)
    cropArea = rectangle;

Зачем второе, если? Это полностью и полностью избыточно. Сценарий, в котором cropArea может по-прежнему иметь значение null или ноль, — это если inputArea.Value имеет значение null/zero, поскольку вы не проверяли это (только если inputArea имеет значение null).

-1
ответ дан 8 December 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: