Почему этот код 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;