2009-05-06 3 views
10
double? test = true ? null : 1.0; 

В моей книге, это то же самое, какПочему этот код C# не компилируется?

if (true) { 
    test = null; 
} else { 
    test = 1.0; 
} 

Но первая строка дает эту ошибку компилятора:

Type of conditional expression cannot be determined because there is no implicit conversion between ' <null> ' and ' double '.

+0

вы всегда можете отправить Errata издателю книги :) или, возможно, это уже было найдено, и оно находится в книге «Исправление» (обычно на веб-сайте издателя) – balexandre

+3

Выражение «в моей книге» означает «насколько я знаю», - это не ссылка на настоящую книгу :-) –

+1

Ваша позиция, что одна и та же, как и другая, не подтверждается ни спецификацией языка, ни реализацией; эти две вещи действительно очень разные! Сообщение об ошибке правильное; спецификация языка требует, чтобы выражение было неявно конвертируемым в double ?, что требует, в свою очередь, выражения известного типа. Выражение не имеет известного типа, следовательно, ошибки. –

ответ

24

Это происходит потому, что компилятор пытается оценить утверждение справа налево. Это означает, что он видит 1.0, и он решает, что он двойной (не двойной?), А затем он видит null.

Так что явно не неявное преобразование между double и null (на самом деле не существует неявное преобразование между Struct и null).

Что вы можете сделать, это явно указать компилятору, что одно из двух выражений, которые конвертируются друг в друга.

double? test = true ? null : (double?) 1.0; // 1 
double? test = true ? (double?)null : 1.0;  // 2 
double? test = true ? default(double?) : 1.0; // 3 
double? test = true ? new double?() : 1.0;  // 4 
+0

Спасибо, это работает! –

7
double? test = true ? (double?)null : 1.0; 

будет работать. Это потому, что нет преобразования из типа первого выражения (null) в тип второго выражения (double).

+0

Хе-хе, тот же ответ просто другой путь вокруг, теперь запутанный :) – leppie

+0

Сюрприз, оба пути работают :) – leppie

+0

«Невозможно преобразовать значение null в« double », потому что это тип значения, не равный нулю:« –

2

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

double? test = true ? (double?) null : 1.0; 
+0

'null' (буква) ** ** конвертируется в' double? '. В противном случае принятый ответ с 'true? null: (двойной?) 1.0' не мог работать. Что «null» не конвертируется в 'double'. –

+0

@JeppeStigNielsen Неявно. Я полностью согласен, что он конвертируемый. –

4

Левая часть задания не используется при выводе типа выражения:?

В b ? A : B типы A и B должны быть одинаковыми или должны быть неявно конвертируемыми в другие.

+2

Здесь какая-то тонкость - это то, что тип A должен быть конвертируемым в тип B или что A должен быть конвертируемым в тип B? Компилятор действительно ошибается! См. Этот пост http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-inference-woes-part-one.aspx для деталей. –

Смежные вопросы