Назначение "двойной?" с помощью "?" оператор не возможен? - PullRequest
0 голосов
/ 16 августа 2011

Я пытаюсь использовать следующий код

double d;
double? a = double.TryParse("3.14", out d) ? d : null;

Но он не скомпилируется, так как «нет неявного преобразования между двойным и нулевым». Разделение кода выше работает следующим образом:

        double d;
        double? a;
        if ( double.TryParse("3.14", out d))
            a = d;
        else
            a = null;

Почему существует разница при использовании? -Оператора?

Ответы [ 5 ]

3 голосов
/ 16 августа 2011

Причина в том, что вы не можете присвоить null для double, и ваше троичное выражение возвращает double, а не double?.Поскольку null не имеет неявного типа, тип возврата вашего троичного выражения определяется частью, которая имеет неявного типа, то есть той части, которая возвращает d.Поскольку d является double, все ваше троичное выражение оценивается как возвращающее double.

Исправьте его, приведя одно из возвращений к double?, например

double d;
double? a = double.TryParse("3.14", out d) ? (double?)d : null;
2 голосов
/ 16 августа 2011

Вы можете привести null к double? справа от оператора объединения нулей, чтобы указать компилятору желаемый тип возврата:

double? a = double.TryParse("3.14", out d) ? d : (double?)null;
1 голос
/ 16 августа 2011

Должно работать следующее, где вы явно приводите ноль

double? a = double.TryParse("3.14", out d) ? d : (double?)null;
0 голосов
/ 16 августа 2011

Вы должны разыграть d до double?.

Попробуйте a = double.TryParse("3.14", out d) ? (double?) d : null;

0 голосов
/ 16 августа 2011

Это потому, что значение NULL должно быть приведено к типу d (в данном случае двойному), а также к типу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...