İfade ağaçları baytlar ve şortlarla çalışırken gereksiz bir dönüşüm oluşturuyor gibi görünüyorlar, her iki tarafı da (örneğin ikili ifadelerde) int32'ye dönüştürüyorlar.İfade ağaçları - int32'ye gereksiz dönüştürme
Bu, gördüğüm bazı Linq sağlayıcılarında, orijinal ifadeye ulaşmak için her birinin bu gereksiz katmanı soymak zorunda olduğu bir sorundur. (NHibernate bu katmanı kaldırmaz ve SQL sorgusunda korkunç bir CAST oluşturur).
// 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));
Bu tam karşılaştırmayı (dönüştürme olmadan) yapan bir ifade oluşturmaya çalışırsanız, başarılı olursunuz.
Soru şu, bu davranışın nedeni nedir?
DÜZENLEME .net 4.0 64bit, aynı 4,5 gerçekten ilginç 64bit
C# derleyicisinin hangi sürümüyle çalışıyorsunuz? Bu aşamadaki tek tahminim, int 'eşitliğin, yalnızca int' (int türünde değerlendirme türleri üzerinde bulunamayan) için tanımlanmış olan .NET'deki ilkel işlemdeki bir yapı olduğu ve bir şekilde bir faktör olduğu çizgileri boyunca olurdu. İşte. –