尝试将 null 分配给可为空的 int 会导致“'int' 和 'null' 之间没有隐式转换”错误
本文关键字:int null 之间 错误 转换 分配 | 更新日期: 2023-09-27 18:34:33
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
有什么想法吗?
如果您尝试将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)
试试这个:
cols.AttribId.HasValue ? (int?)cols.AttribId.Value : null
正在发生的事情是,C#三元必须存在于两个值之间隐式转换。当你写:
cols.AttribId.HasValue ? cols.AttribId.Value : null
cols.AttribId.Value
是无法转换为null
的int
。但是,int?
可以转换为 null
。