赋值“double”?使用“?“不可能操作

本文关键字:操作 不可能操作 不可能 使用 赋值 double | 更新日期: 2023-09-27 18:05:48

我尝试使用以下代码

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

但是它不会编译为"在double和null之间没有隐式转换"。将上面的代码拆分如下:

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

赋值“double”?使用“?“不可能操作

为什么使用?-操作符会有区别?

原因是,您不能将null分配给double,并且您的三元表达式返回double,而不是double?。因为null没有隐式类型,所以三元表达式的返回类型由具有隐式类型的部分决定,即返回d的部分。由于ddouble,因此整个三元表达式的计算结果为返回double

通过将其中一个返回值强制转换为double?来修复它,例如

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

您可以在空合并操作符的右侧将null转换为double?,以向编译器指示所需的返回类型:

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

当您显式转换null

时,下面应该可以工作
double? a = double.TryParse("3.14", out d) ? d : (double?)null;

这是因为null的类型必须是d(这里是double)以及a的类型

必须将d转换为double?

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