lambda expression
我的 C# (.NET 4.7.1) 代码中有以下内容:
DataRow[] skmRows = dtSKM.AsEnumerable().Where(x => x.Field<int>("NDRAWING1").Equals(NDRAWING1) && x.Field<Int16>("NDRAWING2").Equals(NDRAWING2) ).ToArray();
一切都会编译,并且在运行时不会引发异常。问题是上面的 lambda 表达式应该得到结果,但事实并非如此。我停在断点处并验证DataRows
应该已经发生匹配。
然后我将这个表达式复制到Immediate
窗口中VS2017
并运行它——它确实获得了匹配的数据行。啥??
然后我就想知道这一点Int16
。MSSQL 中的相关列是 a SMALLINT
,它映射到 C# 中的 INT16。为了好玩,我将 sql server 中的数据类型从smallint更改为int,并因此更改了我的lambda:
DataRow[] skmRows = dtSKM.AsEnumerable().Where(x => x.Field<int>("NDRAWING1").Equals(NDRAWING1) && x.Field<int>("NDRAWING2").Equals(NDRAWING2) ).ToArray();
...它成功了!(我按预期得到了匹配的行。)
这让我得出结论,.NET 中存在一个错误,运行时无法正确评估 Int16 与smallint sql server 列值的比较。
除了bug还有解释吗?我猜这对任何人来说都应该很容易重现。启动一个 lambda 来匹配 MSSQL 中的 SMALLINT 列,看看会发生什么。
沧海一幻觉
相关分类