【发布时间】:2013-09-02 12:00:27
【问题描述】:
表达式树在处理字节和短裤时似乎构建了不必要的转换,它们将两边(例如在二进制表达式中)转换为 int32。
这是我见过的一些 Linq 提供程序中的一个问题,每个提供程序都必须剥离这个冗余层才能得到原始表达式。 (NHibernate 不会删除这一层,并在 SQL 查询中创建一个糟糕的 CAST)。
// no conversion
Console.WriteLine((Expression<Func<int, int, bool>>) ((s, s1) => s == s1));
// converts to int32
Console.WriteLine((Expression<Func<short, short, bool>>) ((s, s1) => s == s1));
// converts to int32
Console.WriteLine((Expression<Func<byte, byte, bool>>) ((s, s1) => s == s1));
如果您尝试构建一个进行这种精确比较(不进行转换)的表达式,您将成功。
所以问题是,这种行为的原因是什么?
编辑 .net 4.0 64bit,同样适用于 4.5 64bit
【问题讨论】:
-
您使用的是哪个版本的 C# 编译器?在这个阶段我唯一的猜测是,
int相等是 .NET 中的一个内置原始操作,它只为int定义(评估堆栈上不能存在更短的类型),这在某种程度上是一个因素在这里。
标签: c# linq nhibernate expression-trees