C# 转让;双倍;使用“?”&引用;不可能吗?

C# 转让;双倍;使用“?”&引用;不可能吗?,c#,C#,我尝试使用以下代码 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 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;

为什么使用?-运算符时会有差异?

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

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

您可以将null合并运算符右侧的
null
强制转换为
double?
,以向编译器指示所需的返回类型:

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

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

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

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

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

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

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

在显式强制转换空值的情况下,以下操作应该可以工作

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

在显式强制转换空值的情况下,以下操作应该可以工作

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

这是因为空值必须可转换为d类型(本例中为双精度)以及a类型。这是因为空值必须可转换为d类型(本例中为双精度)以及a类型。您必须将
d
转换为
双精度?


尝试
a=double.TryParse(“3.14”,out d)?(double?)d:null;
您必须将
d
转换为
double?


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

此答案中的推理很接近,但有点不正确。更准确的说法是,三元表达式不返回任何类型;错误实际上是无法推断一致的返回类型。@Eric:谢谢您的更正。如果是这样,IMHO,编译器消息也有点不正确。因为它建议将
null
转换为
double
。如果不能推断出任何类型,编译器就不知道应该将
null
转换为哪种类型。@Daniel:问题是:首先我们列出可能的类型。在这种情况下,该列表只包含“double”“。然后我们从列表中删除两个操作数都不能转换为的任何类型。在本例中,这将使列表为空。那么报告的错误是什么?列表变为空,因为null不能转换为double,所以这就是报告的错误。也就是说,我对这里的错误消息也不是特别兴奋。@Eric:谢谢你的解释!这个答案中的推理很接近,但有点不正确。更准确地说,三元表达式不返回任何类型;错误实际上是无法推断一致的返回类型。@Eric:谢谢您的更正。如果是这种情况,IMHO,编译器消息也有点不正确。因为它建议将
null
转换为
double
。如果不能推断出任何类型,编译器就不知道应该转换为哪种类型。@Daniel:事情是这样的:首先我们列出可能的类型。在这种情况下,该列表只包含“double”。然后我们从列表中删除两个操作数都不能转换为的任何类型。在本例中,这将使列表为空。那么报告的错误是什么?列表变为空,因为null不能转换为double,所以这就是报告的错误。也就是说,我对这里的错误消息也不是特别兴奋。@Eric:谢谢你的解释!