Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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 - Fatal编程技术网

C# 可为空<;长期>;不可为空<;长期>;在龙的任务之后

C# 可为空<;长期>;不可为空<;长期>;在龙的任务之后,c#,.net,nullable,C#,.net,Nullable,我在原语上有一个意外的可为null的行为 我的测试代码: Nullable<long> value = long.Parse("5"); Type type = value.GetType(); // at this Point type is System.Int64 and not Nullable<System.Int64> Nullable value=long.Parse(“5”); Type Type=value.GetType(); /

我在原语上有一个意外的可为null的行为

我的测试代码:

Nullable<long> value = long.Parse("5");
Type type = value.GetType();
// at this Point type is System.Int64 and not Nullable<System.Int64>
Nullable value=long.Parse(“5”);
Type Type=value.GetType();
//此时,类型为System.Int64,不可为null

是否有可能,
保持为
可空
,并且不会转换为常规的

否。您已将其分配给
变量

调用
GetType()
时,此函数在
System.Object
上定义。因此,要调用它,我们必须将该值装箱

您可以通过查看为
GetType()调用生成的MSIL指令来查看这一点:
box系统。可为空

调用System.Object.GetType

因此,当它被装箱时,它实际上会将
long?
推到堆栈上,装箱只会给我们一个装箱的
long

因此,在可为null的情况下,结果值是基类型(请参见和)


在本例中,无论如何都没有理由调用
GetType
,因为当您查看
long时,我们知道它是一个
long?

。Parse
返回
long
,而不是
long?

public static long Parse (string s);
当然,您可以转换为
长?
,但这不会改变该语句

long a = long.Parse("5");
Nullable<long> n = a; // convert to long?

对变量调用
GetType
将为您提供运行时类型,而不是编译时类型。当
Parse
在运行时返回一个
long
时,
GetType
肯定也会返回。

long.Parse
始终返回一个
long
,而不是
long?
。所以答案肯定是:不。为什么要使用
long?
?嗯,
long.Parse
返回
long
,而不是
long?
——因此变量的实际内容是
long
。这就是说:如果您的值是
null
,那么无论如何,您不能对其调用
.GetType()
。这个值的强类型为null。我希望在声明之后使用一个可为null的值,而不是一个很长的值。查看文档了解如何识别可为null的值类型。这是错误的。它被分配给一个
long?
@Charlieface当然,但是在我们可以分配它之前,我们必须转换它。好的,但是你没有解释为什么
GetType
返回
long
而不是
long?
@Charlieface查看我的最后一句话…@ArndtBieberstein是的,
GetType
会一直给你值的类型,无论您在编译时如何声明它。当您调用GetType()时,此函数是在System.Object上定义的。因此,要调用它,我们必须将该值装箱。这是非直观的,即使我完全理解它,并且我理解它为什么会发生,但它仍然是非直观的:-)100%同意,
Nullable
(以及通常的valuetype)语义留下了需要的内容“因为我们知道它很长?”不,它不是
长?
-至少在运行时不是这样,在赋值给
long?
变量之后,它是一个
long?
变量。然后将其装箱,将其转换回装箱的
long
5
不是
long?
,但它是可分配给它的。因此,不是,该值仍然是一个
长的
。声明变量的方式和它在运行时所包含的内容之间有着巨大的差异,*这就是
GetType
将要介绍的内容。
long a = long.Parse("Hello"); //throws FormatException