2
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?始终将其标记为可为空,所以为什么它被编译器检测为正常的 int,t.AddRange其中在cols.AttribId.HasValue ? cols.AttribId.Value : null.

有任何想法吗?

4

2 回答 2

3

试试这个:

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

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

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

cols.AttribId.Value是一个int不能转换成的nullint?然而可以转换null.

于 2013-10-08T23:18:24.840 回答
3

如果您尝试将 an 添加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)
于 2013-10-08T23:22:31.773 回答