如何将c#可空int转换为int

我如何将一个可空的int转换为int?假设我有2种类型的int如下:

int? v1;
int v2;

我想把v1的值赋给v2v2 = v1;将导致错误。我如何转换v1v2?

529872 次浏览

可以使用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的空赋值。因此,空合并操作符??只是三元操作符的语法糖:

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();

v1v2之间进行简单的转换是不可能的,因为v1的值域比v2大。它是v1能容纳的所有东西加上null状态。要转换,您需要显式地声明将使用int中的哪个值来映射null状态。最简单的方法是使用??操作符

v2 = v1 ?? 0;  // maps null of v1 to 0

这也可以用长形式表示

int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}

如果你知道v1有一个值,你可以使用Value属性:

v2 = v1.Value;

如果有,使用GetValueOrDefault方法将赋值,否则为类型的默认值,或者您指定的默认值:

v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value


v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value

你可以使用HasValue属性来检查v1是否有值:

if (v1.HasValue) {
v2 = v1.Value;
}

GetValueOrDefault(T)方法也有语言支持:

v2 = v1 ?? -1;

这是可能的v2 = Convert.ToInt32(v1);

Int nullable到Int的转换可以这样完成:

v2=(int)v1;

# EYZ0

检索对象的值。如果它为null,则返回int的默认值,即0。

例子:

# EYZ0

你所需要的是…

v2= v1.GetValueOrDefault();

如果不为空,它将为v1赋值给v2,否则它将采用默认值为零。

v2=v1??0

或者下面是另一种写法。

v2 = v1.HasValue?v1:0

就我而言,最好的解决方案是使用GetValueOrDefault()方法。

v2 = v1.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而不丢失信息是安全的),那么模式匹配可能是最简洁的方法之一。

如果给定类型的默认值是可接受的结果:

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):

v2 = v1.GetValueOrDefault();
< p >
net 4.7.2。: GetValueOrDefault()返回没有任何检查的字段值
 int v2= Int32.Parse(v1.ToString());

在c# 7.1及以后版本中,类型可以通过使用# EYZ0文字而不是# EYZ0运营商来推断,因此它可以写成如下:

v2 = v1 ?? default;

我正在使用c# 9和。net 5作为示例

foo是可空的int,我需要得到foo的int值

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

可以使用以下任何一种转换方法:

# EYZ0

# EYZ0

# EYZ0

# EYZ0

正常的TypeConversion将抛出异常

例如:

int y = 5;
int? x = null;
y = x.value; //It will throw "Nullable object must have a value"
Console.WriteLine(y);

使用Convert.ToInt32()方法

int y = 5;
int? x = null;
y = x.Convert.ToInt32(x);
Console.WriteLine(y);

这将返回0作为输出,因为y是整数。