Почему этот код C # не компилируется? - PullRequest
11 голосов
/ 06 мая 2009
double? test = true ? null : 1.0;

В моей книге это так же, как

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

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

Тип условного выражения не может быть определенным, потому что нет неявное преобразование между '<null>' и 'double'.

Ответы [ 4 ]

28 голосов
/ 06 мая 2009

Это происходит из-за того, что компилятор пытается оценить оператор справа налево. Это означает, что он видит 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
8 голосов
/ 06 мая 2009
double? test = true ? (double?)null : 1.0;

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

4 голосов
/ 06 мая 2009

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

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

2 голосов
/ 06 мая 2009

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

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