В C # почему условный оператор не может неявно приводиться к обнуляемому типу

gcc -I. -o jvct jvct.c libjvc.a
30
задан Josh Lee 7 April 2010 в 10:11
поделиться

5 ответов

Соответствующий раздел спецификации C# 3.0 7.13, условный оператор:

вторые и третьи операнды?: управление оператором тип условного выражения. Позвольте X и Y быть типами вторых и третьих операндов. Затем

, Если X и Y являются тем же типом, то это - тип условного выражения Иначе, если неявное преобразование (В§6.1) существует от X до Y, но не от Y до X, то Y является типом условного выражения. Иначе, если неявное преобразование (В§6.1) существует от Y до X, но не от X до Y, то X тип условного выражения. Иначе никакой тип выражения не может быть определен, и ошибка времени компиляции происходит.

27
ответ дан Brian Liang 7 April 2010 в 10:11
поделиться
  • 1
    @EdwinBuck: isn' t самая логическая вещь сделать просто создание указателя на указанный данные? Просто обновите свои указатели при перемещении указанного объект во время сборки "мусора" – jalf 8 January 2013 в 09:45

Если Ваш функциональный ResultofSomeCalc () возвращает интервал? тогда это будет работать.

, Если Ваша функция возвращает интервал, то компилятор выпускает предупреждение: Тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между 'интервалом' и''
я предполагаю то, именно это Вы видите. Оба выражения в условном операторе"?": должен иметь тот же тип или должен быть конвертируемым к тому же типу через неявный бросок.

Изменение тип возврата ResultOfSomeCalc к интервалу?, или у Вас должен будет быть бросок на нулевом выражении.

0
ответ дан 7 April 2010 в 10:11
поделиться
  • 1
    @jalf - I' m, не сомневаясь относительно Вас особенно, но был бы точно так же, как для нахождения некоторой ссылки, которая на самом деле описывает what' s продолжение – Brian Agnew 16 August 2013 в 09:00
4
ответ дан Community 7 April 2010 в 10:11
поделиться
  • 1
    Микропридеритесь к мелочам: " C++ должен поддержать совместимость с C" не точно верно, там несколько (небольших) несовместимостей. " C++ стремится поддержать совместимость с C" более корректно. – Joachim Sauer 14 April 2010 в 10:00

Я также раздражаюсь, что это не может вывести тип на основе присвоения, особенно когда это - тип значения. Существуют причины хотя при вхождении в объектные иерархии.

, Если "ResultOfSomeCalc ()" возвратил "интервал?", тогда это работало бы . C# должен выяснить тип независимо от того, что налево от присвоения. Таким образом, Вы говорите ему о возврате пустого указателя или интервала - и логика в компиляторе не существует для имения его, заменяют Nullable как общим знаменателем.

Уведомление, что эти варианты ДЕЙСТВИТЕЛЬНО работают, и это может помочь Вам понять:

object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null;

object someValue = true ? (int?)ResultOfSomeCalc() : null;

Hope это помогает.

15
ответ дан TheSoftwareJedi 7 April 2010 в 10:11
поделиться
  • 1
    Никакая проблема с мелочными придирками, все же так или иначе ссылка должна будет в конечном счете быть превращена в адрес. Таблица указателя является самыми логическими средствами выполнения так, но you' право ре, другие средства могли существовать. Таблица указателя не является требованием, но без своего рода поиск, you' ре, имеющее дело с чем-то сгенерированным алгоритмически, которое едва выручит с уплотнением памяти. – Edwin Buck 14 April 2010 в 19:58

Это уверенный кажется, что это - что-то, что компилятор должен смочь выяснить для себя, но существует еще один способ сделать это, с помощью ключевого слова по умолчанию. Это мог бы быть самый крошечный бит, менее ужасный, чем бросок:

int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?);

Это использование значения по умолчанию, кажется, хорошо не документируется, но, действительно работает. По крайней мере, это мешает Вам иметь для замусоривания кода волшебными значениями (я спорю тот пустой указатель/нуль/ложь/и т.д. действительно волшебные значения).

5
ответ дан Mr. Putty 7 April 2010 в 21:11
поделиться
  • 1
    Not-so-micro придираются к мелочам: " ссылка на pointer" таблица, которую Вы упоминаете, является одной возможной реализацией, но никоим образом не требуемый спецификацией Java. – Joachim Sauer 14 April 2010 в 21:01
Другие вопросы по тегам:

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