2011-07-30 16 views
9

Aşağıdaki kod, çalışma zamanında bir istisna atarken, geleneksel şekilde yapmak sorun olmadan derleniyor? Ben tam olarak dönüştürülmesi gerekir hangi ifade belirleyemeyeceğinden,İkili işleci Çarpanı, 'System.Int32' ve 'System.Double' türleri için tanımlanmamıştır.

var left = Expression.Constant(25d); 
var right = Expression.Constant(20); 

// Throws an InvalidOperationException! 
var multiplyExpression = Expression.Multiply(left, right); 

var multiply = 25d * 20; 
Debug.WriteLine(multiply.ToString()); // Works normally! 

Ben Expression.Convert kullanmaz.

+4

Geleneksel yoldan, derleyici, hangi ifadenin dönüştürüleceğini belirlemek için öncelik kuralları kullanarak bir 'Expression.Convert' - (moral karşılığı) ifadesini ekler. –

+0

C# derleyici bu durumda hangi ifadeyi dönüştürdü? –

+1

Sadece "çarpan" türünü kontrol edin, hangi tarafın dönüştürüleceğini size söyleyecektir. – MerickOWA

cevap

7

Peki, hangi düğümün daha yüksek türde bir kesime sahip olacağını belirlemek için TypeCode numaralandırma özelliğini kullanarak sorunun nasıl çözüleceğini çözdüm, ardından ikinci düğümün türünü önceki türüne dönüştürün ve tam tersi:

+0

Oh baraj ... TypeCode Windows Mağazası'nda mevcut değildir. çok yakın... ;( –

0

Başlığınızdaki hata mesajı, neden bir istisna olduğunu size anlatıyor.

System.Int32 ve System.Double parametrelerini argüman olarak alan Expression.Multiply yöntemi tanımlanmamıştır.

*, daha düşük bir düzeye sahip olduğundan ve değerlerinizin otomatik olarak türden yazılacağı için çalışacaktır. Sol tarafı daha yüksek hassasiyet olduğunu bilmiyorum ve her zaman bir double sonuçla bitirmek istiyorum, diyebilirsiniz

0
var left = Expression.Constant(25d); 
var right = Expression.Constant((double)20); 

var multiplyExpression = Expression.Multiply(left, right); // works 
+0

Bu doğrudan yapılamaz, bir şekilde Expression.Convert öğesini çağırmalıyım. –

7

var left = Expression.Constant(25d); 
var right = Expression.Constant(20); 
var multiplyExpression = Expression.Multiply(
    left, 
    Expression.Convert(right, left.Type)); 
Veya gibi bir şey:

Expression left = Expression.Constant(2); 
Expression right = Expression.Constant(25.1); 
left = Expression.Convert(left, typeof(double)); 
right = Expression.Convert(right, typeof(double)); 
var multiplyExpression = Expression.Multiply(left, right); 
+0

Peki, bu iyi görünüyor, ancak bu işlenenler tipte float, ondalık ise, bu nasıl yapılabilir? –

+1

@Islam Ibrahim: Bir dizi olasılık var ve amaçlarınız için çalışacak en basit strateji ile gitmek genellikle en iyisidir. Gereksinimleriniz ve bunların ne işe yaradığına dair daha fazla bilgi paylaşırsanız, eşleştirmek için bir çözüm bulmanıza yardımcı olabiliriz. Örneğin, hangi türden zamanın sonuna gelmek istediğinizi biliyor musunuz, yoksa girdilere bağlı olarak değişecek mi? – StriplingWarrior

İlgili konular