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.
Rectangle cropArea = (!inputArea.HasValue) ? rectangle : inputArea.Value;
Значит, вы говорите, что когда inputArea
равно null
, без оператора if
вы получаете прямоугольник, инициализированный чем-то другим, кроме размера изображения? Я только что попробовал запустить это, и это работает нормально. Убедитесь, что изображение
имеет размер и что inputArea
на самом деле нуль
.
Ваш код кажется правильным. Условное выражение (или условный оператор, или первоначально называвшееся тернарным оператором... теперь все довольны? :)) должно быть взаимозаменяемо с операторами if/else.
Rectangle cropArea = inputArea == null ? rectangle : inputArea.Value;
должны быть точно такими же, как:
Rectangle cropArea;
if (inputArea == null)
{
cropArea = rectangle;
}
else
{
cropArea = inputArea.Value;
}
(на самом деле они должны генерировать один и тот же код IL).
Проследите с помощью отладчика и посмотрите, не выскочит ли что-нибудь.
Какого черта?
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).