3

我有一个返回 nullable 的函数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);
}

第二:需要将空值转换为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;
}

有人知道有什么区别吗?

4

1 回答 1

5

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

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

condition ? first_expression : second_expression;

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

first_expression和的类型second_expression必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

这里的关键区别在于null不能隐式转换为GeometricCircle, (您的类型first_expression)。

因此,您必须明确地使用转换为GeometricCircle?,然后隐式转换为GeometricCircle

于 2012-10-15T08:49:33.077 回答