尝试将null赋给nullable int会导致“'int'和'null'之间没有隐式转换”错误

时间:2013-10-08 23:15:46

标签: c# .net int nullable

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,因为生成“条件表达式的类型无法确定,因为'int'和''”之间没有隐式转换错误cols.AttribId.HasValue ? cols.AttribId.Value : null

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

试试这个:

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

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

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

cols.AttribId.Valueint,无法转换为nullint?可以转换为null

答案 1 :(得分:3)

如果您尝试将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)
相关问题