为什么要将null值转换为可以为null的struct

Mik*_*ogh 3 c# nullable type-conversion

我有一个功能,可以回放一个可空的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);
}
Run Code Online (Sandbox Code Playgroud)

第二:需要将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;
}
Run Code Online (Sandbox Code Playgroud)

有人知道有什么区别吗?

Ric*_*ett 5

在您的第一个示例中,您将null在何时返回size >= epsilon.编译器知道这null是可空类型的有效值.

在第二个示例中,您使用的是?:三元运算符,它具有自己的一组规则.

condition ? first_expression : second_expression;
Run Code Online (Sandbox Code Playgroud)

MSDN告诉我们(我的重点)......

类型first_expressionsecond_expression必须相同,或者必须存在从一种类型到另一种类型的隐式转换.

这里的关键区别是null不能隐式转换为a GeometricCircle(你的类型first_expression).

所以你必须使用强制转换来明确表达,GeometricCircle?然后可以隐式转换为GeometricCircle.