Das Problem ist, dass der Zusatz es als short + short (was vermutlich in IL existiert, auch wenn es in C# nicht existiert) - und dann wird die Konvertierung separat durchgeführt. Dies wird durch dieses vollständige Programm gezeigt - auch ohne die Konvertierung, ist das Ergebnis -32768:
using System;
using System.Linq.Expressions;
class Test
{
static void Main(string[] args)
{
short left = short.MaxValue;
short right = 1;
var a = Expression.Constant(left);
var b = Expression.Constant(right);
var sum = Expression.Add(a, b);
var convert = Expression.ConvertChecked(sum, typeof(short));
var convertLambda = Expression.Lambda<Func<short>>(convert);
var convertFunc = convertLambda.Compile();
Console.WriteLine("Conversion: {0}", convertFunc());
var sumLambda = Expression.Lambda<Func<short>>(sum);
var sumFunc = sumLambda.Compile();
Console.WriteLine("Sum: {0}", sumFunc());
}
}
Wenn Sie eine Addition von int + int und dann die Konvertierung durchführen, kommt es zu einer Overflow-Exception:
using System;
using System.Linq.Expressions;
class Test
{
static void Main(string[] args)
{
short left = short.MaxValue;
short right = 1;
var a = Expression.Constant((int) left);
var b = Expression.Constant((int) right);
var sum = Expression.Add(a, b);
var convert = Expression.ConvertChecked(sum, typeof(short));
var convertLambda = Expression.Lambda<Func<short>>(convert);
var convertFunc = convertLambda.Compile();
Console.WriteLine("Conversion: {0}", convertFunc());
var sumLambda = Expression.Lambda<Func<int>>(sum);
var sumFunc = sumLambda.Compile();
Console.WriteLine("Sum: {0}", sumFunc());
}
}
Ich weiß nicht, warum AddChecked
funktioniert allerdings nicht... das sieht nach einem Fehler aus :( Es ist möglich, dass die Verwendung von die Überladung, die es erlaubt, die Methode zu spezifizieren, würde funktionieren aber ich bin mir nicht sicher...