【发布时间】:2021-08-25 10:53:42
【问题描述】:
让我们有一个简单的类
class User
{
public byte IdByte { get; set; }
}
所以当我写出这样的表达式时:
Expression<Func<User, bool>> expression1 = x => x.IdByte == 3;
Expression<Func<User, bool>> expression2 = x => x.IdByte == (byte)3;
byte b = 3;
Expression<Func<User, bool>> expression3 = x => x.IdByte == b;
Expression<Func<User, bool>> expression4 = x => x.IdByte == byte.MaxValue;
观察表达式调试视图,我看到有一个额外的类型转换为 System.Int32 类型:
//expression1 ------> x => (Convert(x.IdByte, Int32) == 3)
//expression2 ------> x => (Convert(x.IdByte, Int32) == 3)
//expression3 ------> x => (Convert(x.IdByte, Int32) == Convert(value(....c__DisplayClass1_0).b, Int32))
//expression4 ------> x => (Convert(x.IdByte, Int32) == 255)
在第一个和第二个表达式中,将右侧 - 3 转换为字节比将左侧转换为 int 更合理。
在其余情况下,左侧和右侧是字节
我的问题是为什么应用这些转换?
【问题讨论】:
-
快速测试表明,任何小于 int 的东西都会发生这种情况:sharplab.io/…
标签: c# lambda expression