Странное поведение с условным оператором в .Net - PullRequest
7 голосов
/ 29 августа 2010

Это меня довольно озадачило. Может быть, я слишком устала прямо сейчас.

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

    if (inputArea == null)
        cropArea = rectangle;

inputArea - обнуляемый прямоугольник, который в моем конкретном случае равен нулю.

Первые два оператора приводят к параметру cropArea, инициализированному в 0. Второе, однако, дает правильное значение cropArea на основе ширины и высоты изображения. Я что-то не так понял с условным оператором? Кажется, он не возвращает прямоугольник, когда inputArea = null? Есть ли причуды при работе с типами значений?

РЕДАКТИРОВАТЬ: Хорошо, я должен был попробовать это сначала: перезапустил VS. Кажется, отладчик солгал мне или что-то в этом роде. Во всяком случае, работает сейчас. Спасибо.

Ответы [ 5 ]

1 голос
/ 29 августа 2010

Это похоже на неприятную ошибку в режиме отладки Visual Studio, которая вводит вас в заблуждение:

alt text

Теперь F10 , чтобы перешагнуть через эту линию, и вы получите:

alt text

На консоли выводятся правильные значения.

WTF.

0 голосов
/ 29 августа 2010

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

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

if (inputArea == null)
    cropArea = rectangle;

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

0 голосов
/ 29 августа 2010

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

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

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

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

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

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

0 голосов
/ 29 августа 2010

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

0 голосов
/ 29 августа 2010
Rectangle cropArea = (!inputArea.HasValue) ? rectangle : inputArea.Value;
...