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

时间:2012-10-15 08:40:55

标签: c# type-conversion 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);
}

第二:需要将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;
}

有人知道有什么区别吗?

1 个答案:

答案 0 :(得分:5)

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

在您的第二个示例中,您使用的是?: ternary operator,它附带了自己的一套规则。

condition ? first_expression : second_expression;

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

  

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

这里的关键区别是,null无法隐式转换为GeometricCircle,(first_expression的类型)。

所以你必须使用强制转换 explicity ,使用强制转换为GeometricCircle?,然后隐式地转换为GeometricCircle