Cây biểu hiện dường như xây dựng một chuyển đổi không cần thiết khi làm việc với byte và quần short, chúng chuyển đổi cả hai mặt (trong biểu thức nhị phân chẳng hạn) thành int32.Cây biểu thức - chuyển đổi không cần thiết sang int32
Đây là sự cố trong một số nhà cung cấp LINQ mà tôi đã thấy, mỗi nhà cung cấp phải loại bỏ lớp thừa này để chuyển sang biểu thức gốc. (NHibernate không loại bỏ lớp này và tạo ra một CAST khủng khiếp trong truy vấn SQL).
// 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));
Nếu bạn cố gắng tạo biểu thức so sánh chính xác (không có chuyển đổi), bạn sẽ thành công.
Câu hỏi đặt ra là, lý do của hành vi này là gì?
EDIT .net 4.0 64bit, cùng áp dụng cho 4.5 64bit
Phiên bản nào của trình biên dịch C# bạn đang làm việc cùng? Đoán duy nhất của tôi ở giai đoạn này sẽ là dọc theo dòng mà 'int' bình đẳng là một xây dựng trong hoạt động nguyên thủy trong. NET đó chỉ được định nghĩa cho' int' (loại ngắn hơn không thể tồn tại trên stack đánh giá) và đó là bằng cách nào đó một yếu tố đây. –