繁体   English   中英

如何将 C# 可为空的 int 转换为 int

[英]How to convert C# nullable int to int

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

int? v1;  
int v2; 

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

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

v2 = v1 ?? default(int);

任何Nullable<T>都可以隐式转换为其T ,前提是正在评估的整个表达式永远不会导致对 ValueType 的 null 分配。 那么,空合并运算符?? 只是三元运算符的语法糖:

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

像这样,

if(v1.HasValue)
   v2=v1.Value

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

v2 = v1.Value;

所有你需要的是..

v2= v1.GetValueOrDefault();

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

如果 v1 为空,则无法执行此操作,但可以使用运算符进行检查。

v2 = v1 ?? 0;

GetValueOrDefault()

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

例子:

v2= v1.GetValueOrDefault();

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

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()返回字段值而不进行任何检查。

就我而言,最好的解决方案是使用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的类型(在本例中为int )类型兼容时,if 条件才会通过。 因此,当v1值为null ,if 条件将失败,因为 null 不能分配给int 更准确地说, null不是int

  • 我想强调的是,此解决方案可能并不总是最佳选择。 正如我所建议的,我相信这将取决于开发人员的确切使用上下文。 如果你已经有一个int? 并且想要有条件地对其值进行操作,当且仅当分配的值不为空时(这是将可为空的 int 转换为常规 int 而不丢失信息的唯一一次安全的时间),那么模式匹配可能是其中之一最简洁的方法来做到这一点。

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

Int nullable to int 转换可以像这样完成:

v2=(int)v1;

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

在 C# 7.1 及更高版本中,可以通过使用default文字而不是default运算符来推断类型,因此可以编写如下:

v2 = v1 ?? default;

你可以做

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

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

v2=v1??0

或者下面是另一种写法。

v2 = v1.HasValue?v1:0

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

v2 = Convert.ToInt32(v1);

v2 = (int)v1;

v2 = v1.GetValueOrDefault();

v2 = v1.HasValue ? v1:0;

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

我正在研究 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查看更多-类型

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM