Деревья выражений, похоже, создают ненужное преобразование при работе с байтами и шортами, они конвертируют обе стороны (в двоичных выражениях, например) в int32.
Это проблема некоторых поставщиков Linq, которые я видел, каждый из которых должен очистить этот избыточный слой, чтобы перейти к исходному выражению. (NHibernate не удаляет этот слой и создает ужасный CAST в 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));
Если вы попытаетесь создать выражение, которое делает это точное сравнение (без преобразования), вы добьетесь успеха.
Итак, вопрос в том, в чем причина такого поведения?
ИЗМЕНИТЬ .net 4.0 64bit, то же самое относится к 4,5 64-битным