Соответствующий раздел спецификации C# 3.0 7.13, условный оператор:
вторые и третьи операнды?: управление оператором тип условного выражения. Позвольте X и Y быть типами вторых и третьих операндов. Затем
, Если X и Y являются тем же типом, то это - тип условного выражения Иначе, если неявное преобразование (В§6.1) существует от X до Y, но не от Y до X, то Y является типом условного выражения. Иначе, если неявное преобразование (В§6.1) существует от Y до X, но не от X до Y, то X тип условного выражения. Иначе никакой тип выражения не может быть определен, и ошибка времени компиляции происходит.
Если Ваш функциональный ResultofSomeCalc () возвращает интервал? тогда это будет работать.
, Если Ваша функция возвращает интервал, то компилятор выпускает предупреждение: Тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между 'интервалом' и''
я предполагаю то, именно это Вы видите. Оба выражения в условном операторе"?": должен иметь тот же тип или должен быть конвертируемым к тому же типу через неявный бросок.
Изменение тип возврата ResultOfSomeCalc к интервалу?, или у Вас должен будет быть бросок на нулевом выражении.
Я также раздражаюсь, что это не может вывести тип на основе присвоения, особенно когда это - тип значения. Существуют причины хотя при вхождении в объектные иерархии.
, Если "ResultOfSomeCalc ()" возвратил "интервал?", тогда это работало бы . C# должен выяснить тип независимо от того, что налево от присвоения. Таким образом, Вы говорите ему о возврате пустого указателя или интервала - и логика в компиляторе не существует для имения его, заменяют Nullable как общим знаменателем.
Уведомление, что эти варианты ДЕЙСТВИТЕЛЬНО работают, и это может помочь Вам понять:
object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null;
object someValue = true ? (int?)ResultOfSomeCalc() : null;
Hope это помогает.
Это уверенный кажется, что это - что-то, что компилятор должен смочь выяснить для себя, но существует еще один способ сделать это, с помощью ключевого слова по умолчанию. Это мог бы быть самый крошечный бит, менее ужасный, чем бросок:
int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?);
Это использование значения по умолчанию, кажется, хорошо не документируется, но, действительно работает. По крайней мере, это мешает Вам иметь для замусоривания кода волшебными значениями (я спорю тот пустой указатель/нуль/ложь/и т.д. действительно волшебные значения).