如何将C#nullable int转换为int

时间:2011-05-13 16:59:22

标签: c# nullable

如何将可空int转换为int?假设我有两种类型的int,如下所示:

int? v1;  
int v2; 

我想将v1的值分配给v2v2 = v1;会导致错误。如何将v1转换为v2

20 个答案:

答案 0 :(得分:566)

到目前为止,其他答案都是正确的;我只想添加一个更清洁的东西:

v2 = v1 ?? default(int);

任何Nullable<T>都可以隐式转换为T,PROVIDED表示正在计算的整个表达式永远不会导致对ValueType的null赋值。因此,null-coalescing运算符??只是三元运算符的语法糖:

v2 = v1 == null ? default(int) : v1;

...这又是if / else:

的语法糖
if(v1==null)
   v2 = default(int);
else
   v2 = v1;

此外,从.NET 4.0开始,Nullable<T>有一个“GetValueOrDefault()”方法,它是一个空的安全getter,它基本上执行上面显示的null-coalescing,所以这也适用:

v2 = v1.GetValueOrDefault();

答案 1 :(得分:146)

像这样,

if(v1.HasValue)
   v2=v1.Value

答案 2 :(得分:81)

您可以使用Value属性进行分配。

v2 = v1.Value;

答案 3 :(得分:71)

All you need is..

v2= v1.GetValueOrDefault();

答案 4 :(得分:45)

如果您知道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;

答案 5 :(得分:42)

如果v1为null,则无法执行此操作,但您可以与操作员联系。

v2 = v1 ?? 0;

答案 6 :(得分:27)

  

GetValueOrDefault()

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

示例:

  

v2= v1.GetValueOrDefault();

答案 7 :(得分:11)

可以使用v2 = Convert.ToInt32(v1);

答案 8 :(得分:11)

Int intullable to int conversion可以这样完成:

v2=(int)v1;

答案 9 :(得分:10)

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

v2 = v1.GetValueOrDefault();

答案 10 :(得分:9)

你可以做到

v2 = v1.HasValue ? v1.Value : v2;

答案 11 :(得分:9)

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;
}

答案 12 :(得分:8)

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

if (v1.HasValue)
    v2 = v1.GetValueOrDefault();

如果要在不确定结果时使用其他默认值:

v2 = v1.GetValueOrDefault(255);    // or any valid value for int in place of 255

如果只希望返回值(无论方法是否失败):

v2 = v1.GetValueOrDefault();


.NET 4.7.2.:GetValueOrDefault()返回字段值,而无需进行任何检查。

答案 13 :(得分:8)

在C#7.1和更高版本中,可以通过使用default literal而不是default operator来推断类型,因此可以如下所示:

v2 = v1 ?? default;

答案 14 :(得分:3)

根据您的使用情况,您可以使用C#7的模式匹配功能:

v1

编辑:

由于有些人在没有留下解释的情况下进行了贬低,我想补充一些细节来解释将其作为可行解决方案的理由。

  • C# 7's pattern matching现在允许我们检查值的类型并隐式转换它。在上面的代码段中,if条件只会在v2中存储的值与int的类型兼容时传递,在这种情况下为v1。因此,当null的值为int时,if条件将失败,因为无法将null分配给null。更准确地说,int不是int?

  • 我想强调一下,这个解决方案并不总是最佳选择。正如我的建议,我相信这将取决于开发人员的确切使用情况。如果您已经拥有{{1}}并希望有条件地操作其值 if-and-only-if ,则指定的值不为空(这是唯一可以安全转换的值nullable int到一个常规的int而不会丢失信息),然后模式匹配可能是最简洁的方法之一。

答案 15 :(得分:2)

如果它不为空,它会将v1的值分配给v2,否则它将默认值设为零。

v2=v1??0

或者下面是写它的另一种方式。

v2 = v1.HasValue?v1:0

答案 16 :(得分:0)

 int v2= Int32.Parse(v1.ToString());

答案 17 :(得分:0)

我正在研究 C# 9 和 .NET 5,示例

foo 是可为空的 int,我需要获取 foo

的 int 值
var foo = (context as AccountTransfer).TransferSide;
int value2 = 0;
if (foo != null)
{
    value2 = foo.Value;
}

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types#examination-of-an-instance-of-a-nullable-value-type查看更多

答案 18 :(得分:0)

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

v2 = Convert.ToInt32(v1);

v2 = (int)v1;

v2 = v1.GetValueOrDefault();

v2 = v1.HasValue ? v1:0;

答案 19 :(得分:-1)

普通的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 是一个整数。

相关问题