4

次のオーバーロードされたメソッドがあるとします。

public string Test(long item)
{
    return "Test with a long was called!";
}

public string Test(int item)
{
    return "Test with an int was called!";
}

public string Test(object item)
{
    return "Test with an object was called!";
}

を呼び出すとTest()、次のように を渡しshortます。

short shortValue = 7;
var result = Test(shortValue);

値がではなく にresult等しいのはなぜですか?"Test with an int was called!""Test with an object was called!"

4

2 に答える 2

2

C# 仕様規則は、コンパイラが ashortintではなく に変換することを優先することを意味しobjectます。これは、 7.5.3.5 Better conversion targetの次のルールによるものだと思います(リンクは C# 5 仕様のダウンロードへのリンク、またはC# 1.2オンラインの同等のものを参照してください) 。

2 つの異なる型 T1 と T2 が与えられた場合、次の少なくとも 1 つが成り立つ場合、T1 は T2 よりも適切な変換ターゲットです。

  • T1 から T2 への暗黙的な変換が存在し、T2 から T1 への暗黙的な変換は存在しない
  • T1 は符号付き整数型で、T2 は符号なし整数型です。【その他内容省略】

このシナリオ用に書き直すと、 から への暗黙的な変換が存在し、 からintへの暗黙的な変換が存在しないため、 への変換objectがより適切な変換になります。objectintint

于 2013-09-25T17:58:39.543 に答える