Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可空值类型_C#_.net_Nullable_Value Type - Fatal编程技术网

C# 可空值类型

C# 可空值类型,c#,.net,nullable,value-type,C#,.net,Nullable,Value Type,如果一个值类型被声明为可为null,我应该如何对此采取预防措施?即,如果在构造函数中,我有: public Point3 ( Point3 source ) { this.X = source.X; this.Y = source.Y; this.Z = source.Z; } 如果源为空,它会失败吗?如果是值类型,我看不出点3为空的可能性。你没有漏掉一个问号吗?如果您的真正意思是Point3?,那么您应该像以下那样访问它: public Point3 ( Point3

如果一个值类型被声明为可为null,我应该如何对此采取预防措施?即,如果在构造函数中,我有:

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

如果源为空,它会失败吗?

如果是值类型,我看不出
点3
空的可能性。你没有漏掉一个问号吗?如果您的真正意思是
Point3?
,那么您应该像以下那样访问它:

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

在这种情况下,
Value
属性将抛出一个异常,如果它是
null

是,如果
source
为null,该异常将失败

如果
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
值,只需保留示例中的方法即可。该方法不接受可为空的
null
,因此在这种情况下,您不必担心它是
null

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

如果
源代码
点3?
它就不是
点3
。据我所知,它在编译时会失败。要发送
点3?
您必须使用
.Value
,如果它为null,我相信它会引发异常。

Nullable没有属性X、Y、Z。。。您应该使用cast或Value属性…很抱歉,我不知道该类型必须写入为null。我认为任何值类型都可以这样声明。不,值类型不能为null。可空类型是.NET2.0中添加的一项功能,用于填补值类型的这一空白。您必须显式使用可为null的变量才能将其设置为null。谢谢。所以我必须有一个像上面一样的构造函数,让用户能够将Point3声明为可空的,对吗?我可以同时包含值类型的可空构造函数和常规构造函数吗?不,它与值类型无关。任何值类型都可以通过添加问号声明为可空。事实上,可为null的类型实际上是可为null的,而不是T。我想我得读一下。我认为,如果开发人员提供可为null的支持以及不可为null的支持,就可以了。
    public Point3(Point3? source) { 
       this.X = source.GetValueOrDefault().X; 
        this.Y = source.GetValueOrDefault().Y;
        this.Z = source.GetValueOrDefault().Z; 
    }