演算子の優先順位と評価の方向性の考え方と混同しています。
いいえ、違います。これはよく混乱しますが、整数が文字列に変換されるかどうか、または整数を文字列に追加することが合法である理由の問題には、優先順位も評価の順序も関係しないため、混乱することはありません。 。
あなたが混乱していると主張する点で最初にあなたを混乱させないために、規則は非常に単純です:
- 式は、演算子の優先順位と結合性に従って括弧で囲まれています。
- 部分式は左から右の順序で評価されます。
それを正しくするために知っておく必要があるのはそれだけです。Q()がセッター付きのインデクサーを持つオブジェクトを返し、他のメソッドはすべて整数を返すとします。
Q()[R()] = A() * B() + C() / D();
これは、優先順位と結合性に従って括弧で囲まれています。
Q()[R()] = ( ( A() * B() ) + ( C() / D() ) );
そして今、すべての部分式は左から右に評価されます。それ自体が部分式を持っている部分式を含む、すべての部分式。したがって、これはプログラムと同等です。
var q = Q();
var r = R();
var a = A();
var b = B();
var t1 = a * b;
var c = C();
var d = D();
var t2 = c / d;
var t3 = t1 + t2;
最後に、qのインデックスセッターがインデックスrと値t3で呼び出されます。
左側のすべての部分式は、右側のすべての部分式の前に評価されることに注意してください。A() * B()
が残っC() / D()
ているので、最初に発生します。
これはあなたの質問とは何の関係もありません。あなたの質問は誤解に基づいています。
上記の例でiが文字列に変換され、実際にコンパイルエラーが発生しない理由を知りたい
あなたの誤解があります。文字列に変換されてi
いません。に変換されていobject
ます。あなたのプログラムは、次のものとまったく同じです。
int i = 10;
string k = "Test";
string t1 = System.String.Concat((object)i, (string)k);
Console.WriteLine(t1);
string t2 = System.String.Concat((string)k, (object)i);
Console.WriteLine(t2);
ご覧のとおり、そもそもi
から文字列への変換はありません。i
ボクシング変換を介してオブジェクトに変換されてから、String.Concat
メソッドに渡されます。次に、そのメソッドobject.ToString()
はボックス化された整数を呼び出します。
つまり、次の前半を扱います。
上記の例でiが文字列に変換され、実際にコンパイルエラーが発生しない理由を知りたい
後半は、なぜコンパイルエラーがないのですか?
なぜコンパイルエラーが発生する必要があるのですか?C#仕様では、任意の文字列を任意のオブジェクトに追加したり、任意のオブジェクトを任意の文字列に追加したりできるとされています。intはオブジェクトであるため、文字列に追加できます。