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

int? v1;  
int v2; 

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


当前回答

在c# 7.1及以后版本中,类型可以通过使用默认字面值而不是默认操作符来推断,因此它可以写成如下:

v2 = v1 ?? default;

其他回答

到目前为止,其他答案都是正确的;我只是想再加一个稍微干净一点的:

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

可以使用Value属性进行赋值。

v2 = v1.Value;

我正在使用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

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

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

这也可以用长形式表示

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

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

v2 = v1.GetValueOrDefault();