【问题标题】:c# why can't a nullable int be assigned null as a value [duplicate]c#为什么不能将可为空的int分配为null作为值[重复]
【发布时间】:2010-09-24 17:36:50
【问题描述】:

解释为什么不能为可为空的 int 分配 null 的值,例如

int? accom = (accomStr == "noval" ? null  : Convert.ToInt32(accomStr));

那段代码有什么问题?

【问题讨论】:

  • 您可以为 NullableInt 分配空值,如果 val 是您的 nullableint 变量而不是 val=new NullableInt(true); 则只需使用以下语法;

标签: c# nullable


【解决方案1】:

问题不在于 null 不能分配给 int 吗?问题是三元运算符返回的两个值必须是同一类型,或者一个必须隐式转换为另一个。在这种情况下,null 不能隐式转换为 int,反之亦然,因此需要显式转换。试试这个:

int? accom = (accomStr == "noval" ? (int?)null : Convert.ToInt32(accomStr));

【讨论】:

  • 这很有趣——你实际上并不需要 Convert.ToInt32 的演员表...
  • 这是因为 System.Int32 != System.Nullable
  • 为什么要长?没有演员的工作?
  • 正如 Joe R 所说,我在 Convert.ToInt32() 上的演员表是不必要的。有一个从 int 到 int? 的隐式转换。无论您是否使用 int,都需要对 null 进行强制转换?还是长?其他选项是仅将 Convert.ToInt32() 转换为 int?还是长? (正如 Will Dean 所建议的那样),因为这将使 null 可转换为可为 null 的类型。问题是没有来自 => int 或来自 int => . 的隐式转换
  • 我更喜欢 default(int?) 而不是 (int?)null;
【解决方案2】:

Harry S 说的完全正确,但是

int? accom = (accomStr == "noval" ? null : (int?)Convert.ToInt32(accomStr));

也可以解决问题。 (我们 Resharper 用户总是可以在人群中发现彼此...)

【讨论】:

  • 现在这很好,这只是一个细微的差别,但非常简单!如果可以的话会+2(尽管这是一件小事)=)
【解决方案3】:

另一种选择是使用

int? accom = (accomStr == "noval" ? Convert.DBNull : Convert.ToInt32(accomStr); 

我最喜欢这个。

【讨论】:

  • 你真的试过这个吗?它应该给出错误“无法将类型'object'隐式转换为'int?'。存在显式转换(您是否缺少强制转换?)”
【解决方案4】:

我也做了很长时间:

myLongVariable = (!string.IsNullOrEmpty(cbLong.SelectedItem.Value)) ? Convert.ToInt64(cbLong.SelectedItem.Value) : (long?)null;

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2021-10-12
    • 1970-01-01
    • 2010-11-09
    • 2011-08-11
    相关资源
    最近更新 更多