【问题标题】:Attempting to assign null to nullable int results in "There is no implicit conversion between 'int' and 'null'" error尝试将 null 分配给可为空的 int 会导致“'int' 和 'null' 之间没有隐式转换”错误
【发布时间】:2013-10-08 23:15:45
【问题描述】:
public List<Tuple<int, int, int, string, int, int, Tuple<bool, bool, int?>>> 
    GetValues(int someId, int someOtherlId)
{
    var t = new List<Tuple<int, int, int, string, int, int, Tuple<bool, bool, int?>>>();
    using (var context = new Entities(ConnString))
    {
        var pc = context.SomeTable.Where(c => c.SomeId == someId && 
            c.SomeOtherId == someOtherId).OrderBy(c => c.Id).ToList();
        t.AddRange(pc.Select(cols => new Tuple<int, int, int, string, int, int, Tuple<bool, bool, int?>>
            (cols.Id, cols.someId, cols.someOtherId, cols.ColumnName, cols.MinDataLength,
            cols.MaxDataLength, new Tuple<bool, bool, int?>(cols.Required, cols.Eav.HasValue && cols.Eav.Value,
                cols.AttribId.HasValue ? cols.AttribId.Value : null))));
    }
        return t;
    }
}

无法弄清楚为什么此代码无法编译并生成“'int' 和 'null' 之间没有隐式转换”错误。

在那第二个元组中,int?一直被标记为可为空,所以为什么它在t.AddRange 中被编译器检测为正常的 int,这会在@987654324 处生成“无法确定条件表达式的类型,因为 'int' 和 '' 之间没有隐式转换”错误@。

有什么想法吗?

【问题讨论】:

  • Tuple 太可怕了!至少将该类扩展为自定义类!
  • @m-y 也许吧,但作为一种将数据从 DAL 传输到 BI 层的方法,它肯定胜过 DTO……至少在我的书中。
  • 只是将元组扩展为一个更简单的名称,元组不是密封的。
  • @m-y 我明白了,这是个好主意,谢谢。

标签: c# .net int nullable


【解决方案1】:

如果您尝试将 int? 添加到已经接受 int? 的元组中,为什么不直接将其添加到您的元组中 - 即替换:

new Tuple<bool, bool, int?>(..., cols.AttribId.HasValue ? cols.AttribId.Value : null)

new Tuple<bool, bool, int?>(..., cols.AttribId)

或者更简洁一点,利用 Tuple.Create 的类型推断:

Tuple.Create(..., cols.AttribId)

【讨论】:

  • 是的,这显然更好,我从不可为空转换为可空,因此正如您指出的那样,无论如何都不再需要检查...
【解决方案2】:

试试这个:

cols.AttribId.HasValue ? (int?)cols.AttribId.Value : null

发生的情况是 C# 三元必须存在两个值之间的隐式转换。当你写:

cols.AttribId.HasValue ? cols.AttribId.Value : null

cols.AttribId.Value 是一个int,不能转换为nullint? 但是可以转换为null

【讨论】:

  • 成功了,想解释一下原因吗?我的意思是,AttribId 是数据库中的可为空字段...我假设 AttribId.Value 不能为空,因此是一个 int...
  • 编辑答案并附上解释
  • 请注意,它也可以反过来工作:cols.AttribId.HasValue ? cols.AttribId.Value : (int?)null
猜你喜欢
  • 2016-06-24
  • 2015-07-14
  • 2011-05-16
  • 2010-11-19
  • 1970-01-01
  • 2014-01-29
  • 2013-09-01
  • 1970-01-01
  • 2016-10-30
相关资源
最近更新 更多