質問

を考えると2つのショートパンツ(System.Int16

short left = short.MaxValue;
short right = 1;

私はそれらを追加するときOverflowExceptionを取得したい。

checked(left+right)

left+rightの結果はInt32あるので、動作しません。

checked((short)(left+right))

期待通りに動作します。

私の問題は、式ツリーを使用して、「トリック」が動作しない、ということです。

var a = Expression.Constant(left);
var b = Expression.Constant(right);
var sum = Expression.ConvertChecked(Expression.Add(a, b), typeof(short));
var l = Expression.Lambda(sum);
var f = (Func<short>)l.Compile();

f()を呼び出すと、オーバーフロー例外をスローしますが-32768を返していません。何が悪いのでしょうか?

役に立ちましたか?

解決

問題は、添加が が(おそらく、それはC#で存在していない場合でも、ILに存在する)のような短い+短い行われていることである - そして、変換は、別々に行われます。これは、この完全なプログラムで示されている - でも、変換せずに、結果は-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());
    }
}

あなたはそれがint + int型に加え、その後、変換を行う作る場合は、オーバーフロー例外がスローされます。

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());
    }
}

AddCheckedはしかし動作しない理由を私は知らない...それはバグのように見える:(それは<のhref = "http://msdn.microsoft.com/en-us/library/を使用している可能性がありますbb336728.aspx」のrel = 『nofollowをnoreferrer』>指定する方法を可能に過負荷がに働くだろうが、私はわからないんだけど...

他のヒント

感謝します。

他の言葉で:式ツリーに1:あなたがC#で見る何が1を翻訳することはできません。私は疑問に思う なぜ彼らは、暗黙的にint型への2つのショートパンツの合計を広げることにしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top