我有一个函数可以返回一个可以为空的struct
。
我注意到两个类似的案例
第一:效果很好:
public static GeometricCircle? CircleBySize(GeometricPoint point, double size)
{
if (size >= epsilon)
return null;
return new GeometricCircle(point.Position, new Vector(1, 0, 0), size, true);
}
第二:需要将null值转换为GeometricCircle?
public static GeometricCircle? CircleBySize(GeometricPoint point, double size)
{
return size > epsilon ? new GeometricCircle(point.Position, new Vector(1, 0, 0), size, true) : (GeometricCircle?)null;
}
有人知道有什么区别吗?
答案 0 :(得分:5)
在您的第一个示例中,您将在null
时返回size >= epsilon
。编译器知道null
是可空类型的有效值。
在您的第二个示例中,您使用的是?:
ternary operator,它附带了自己的一套规则。
condition ? first_expression : second_expression;
MSDN告诉我们(我的重点)......
first_expression
和second_expression
的类型必须相同,或者隐式转化必须从一种类型存在到另一种类型。
这里的关键区别是,null
无法隐式转换为GeometricCircle
,(first_expression
的类型)。
所以你必须使用强制转换 explicity ,使用强制转换为GeometricCircle?
,然后隐式地转换为GeometricCircle
。