我如何将一个可空的int转换为int?假设我有2种类型的int如下:
int
int? v1; int v2;
我想把v1的值赋给v2。v2 = v1;将导致错误。我如何转换v1到v2?
v1
v2
v2 = v1;
可以使用Value属性进行赋值。
v2 = v1.Value;
像这样,
if(v1.HasValue) v2=v1.Value
如果v1为空,就不能这样做,但可以用运算符检查。
v2 = v1 ?? 0;
你可以这样做
v2 = v1.HasValue ? v1.Value : v2;
到目前为止,其他答案都是正确的;我只是想再加一个稍微干净一点的:
v2 = v1 ?? default(int);
任何Nullable<T>都可以隐式转换为它的T,前提是被计算的整个表达式永远不会导致对ValueType的空赋值。因此,空合并操作符??只是三元操作符的语法糖:
Nullable<T>
T
??
v2 = v1 == null ? default(int) : v1.Value;
...这反过来是if/else的语法糖:
if(v1==null) v2 = default(int); else v2 = v1.Value;
此外,从。net 4.0开始,Nullable<T>有一个“GetValueOrDefault()”;方法,它是一个空安全的getter,基本上执行如上所示的空合并,所以这也是有效的:
v2 = v1.GetValueOrDefault();
在v1和v2之间进行简单的转换是不可能的,因为v1的值域比v2大。它是v1能容纳的所有东西加上null状态。要转换,您需要显式地声明将使用int中的哪个值来映射null状态。最简单的方法是使用??操作符
null
v2 = v1 ?? 0; // maps null of v1 to 0
这也可以用长形式表示
int v2; if (v1.HasValue) { v2 = v1.Value; } else { v2 = 0; }
如果你知道v1有一个值,你可以使用Value属性:
Value
如果有,使用GetValueOrDefault方法将赋值,否则为类型的默认值,或者您指定的默认值:
GetValueOrDefault
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
你可以使用HasValue属性来检查v1是否有值:
HasValue
if (v1.HasValue) { v2 = v1.Value; }
GetValueOrDefault(T)方法也有语言支持:
GetValueOrDefault(T)
v2 = v1 ?? -1;
这是可能的v2 = Convert.ToInt32(v1);
v2 = Convert.ToInt32(v1);
Int nullable到Int的转换可以这样完成:
v2=(int)v1;
# EYZ0
检索对象的值。如果它为null,则返回int的默认值,即0。
例子:
你所需要的是…
v2= v1.GetValueOrDefault();
如果不为空,它将为v1赋值给v2,否则它将采用默认值为零。
v2=v1??0
或者下面是另一种写法。
v2 = v1.HasValue?v1:0
就我而言,最好的解决方案是使用GetValueOrDefault()方法。
GetValueOrDefault()
根据你的使用上下文,你可以使用c# 7的模式匹配特性:
int? v1 = 100; if (v1 is int v2) { Console.WriteLine($"I'm not nullable anymore: {v2}"); }
由于有些人没有留下解释就投了反对票,我想添加一些细节来解释将此作为可行解决方案的基本原理。
c# 7的模式匹配现在允许我们检查值的类型并隐式强制转换。在上面的代码片段中,只有当存储在v1中的值与v2的类型兼容时,if条件才会传递,在本例中是int。因此,当v1的值为null时,if条件将失败,因为不能将null分配给int。更确切地说,null不是int。
我想强调的是,这种解决方案可能并不总是最佳的选择。正如我所建议的,我相信这将取决于开发人员的确切使用上下文。如果您已经有一个int?,并且希望有条件地操作它的值当且仅当分配的值不是null(这是唯一一次将可空int转换为常规int而不丢失信息是安全的),那么模式匹配可能是最简洁的方法之一。
int?
如果给定类型的默认值是可接受的结果:
if (v1.HasValue) v2 = v1.GetValueOrDefault();
如果你想在结果为undefined时获得不同的默认值:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
If you just want the value returned (no matter if the method failed or not):
int v2= Int32.Parse(v1.ToString());
在c# 7.1及以后版本中,类型可以通过使用# EYZ0文字而不是# EYZ0运营商来推断,因此它可以写成如下:
v2 = v1 ?? default;
我正在使用c# 9和。net 5作为示例
foo是可空的int,我需要得到foo的int值
foo
var foo = (context as AccountTransfer).TransferSide; int value2 = 0; if (foo != null) { value2 = foo.Value; }
详见https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types#examination-of-an-instance-of-a-nullable-value-type
可以使用以下任何一种转换方法:
正常的TypeConversion将抛出异常
例如:
int y = 5; int? x = null; y = x.value; //It will throw "Nullable object must have a value" Console.WriteLine(y);
使用Convert.ToInt32()方法
Convert.ToInt32()
int y = 5; int? x = null; y = x.Convert.ToInt32(x); Console.WriteLine(y);
这将返回0作为输出,因为y是整数。