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
没有隐式类型,所以三元表达式的返回类型由具有隐式类型的部分确定,即返回的部分urnsd
。由于d
是一个double
,因此整个三元表达式的计算结果将返回一个double
通过将其中一个返回值强制转换为double?
,例如:
double d;
double? a = double.TryParse("3.14", out d) ? (double?)d : null;
原因是,您不能将
null
赋值给double
,并且三元表达式返回的是double
,而不是double?
。因为null
没有隐式类型,所以三元表达式的返回类型由具有隐式类型的部分确定,即返回的部分urnsd
。由于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:谢谢你的解释!