Почему этот код C# не компилируется?

double? test = true ? null : 1.0;

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

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

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

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

4 ответа

Решение

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

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

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

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

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

double? test = true ? (double?) null : 1.0;
Другие вопросы по тегам