可以为值的值类型

时间:2009-06-01 20:24:10

标签: c# .net nullable value-type

如果值类型被声明为可为空,那么我该如何采取预防措施呢?即如果在构造函数中我有:

public Point3 ( Point3 source )
{
    this.X = source.X;
    this.Y = source.Y;
    this.Z = source.Z;
}
如果source为null,它会失败吗?

5 个答案:

答案 0 :(得分:10)

如果Point3是值类型,我认为null不可能Point3?。你不想错过问号吗?如果您的意思是public Point3 ( Point3? source ) { this.X = source.Value.X; this.Y = source.Value.Y; this.Z = source.Value.Z; } ,那么您应该像以下一样访问它:

Value

在这种情况下,null属性会抛出异常,如果它是{{1}}。

答案 1 :(得分:3)

此方法的调用者将无法传入可为空的点,因为该方法采用常规点,而不是Nullable点。因此,您不必担心构造函数代码中的Point为null。

答案 2 :(得分:2)

是的,如果source为空,则会失败。

如果source为空,您必须确定正确的行为。你可能只是抛出异常。

public Point3 ( Point3? source )
{
    if (source == null) 
    {
        throw new ArgumentNullException("source");
    }

    this.X = source.Value.X;
    this.Y = source.Value.Y;
    this.Z = source.Value.Z;
}

或者,如果您不想接受null的{​​{1}}值,请按照示例中的方法保留该方法。该方法不接受source,因此在这种情况下您不必担心它是Nullable<Point3>

答案 3 :(得分:1)

如果sourcePoint3?,则不会是Point3。据我所知,编译时间会失败。要发送Point3?,您必须使用.Value,如果它为空则会抛出异常。

答案 4 :(得分:1)

    public Point3(Point3? source) { 
       this.X = source.GetValueOrDefault().X; 
        this.Y = source.GetValueOrDefault().Y;
        this.Z = source.GetValueOrDefault().Z; 
    }