次の簡単なプログラムを考えてみましょう:
static class Program
{
static void Main()
{
}
static void Method(short? x)
{
const int y = 50; // note: is Int32, but is const and within Int16 range
var z = x ?? y; // note: var keyword used; IDE is confused about the type!
TakeOnlyInt16(z);
z.OnThisInt16();
}
static void TakeOnlyInt16(short a)
{
}
static void OnThisInt16(this short a)
{
}
}
このプログラムにはまったく問題はなく、問題なくコンパイルされます。Method
(そして、おそらくfromへの呼び出しを含めて実行できますMain
。)
ただし、Visual Studio IDEは、ローカル変数の型について間違った印象を持っていますz
。実際には( C# では別名) であるz
のに、 であると考えているようです。この問題は、少なくとも 3 つの状況で発生します。Int32
Int16
short
var
キーワードに「ホバー」する (マウスを押したままにする)Int32
と、ツールチップに表示されます。それは間違いです。テキスト (キーボード) カーソルをステートメント
TakeOnlyInt16(z);
inside内に移動するMethod
と、このステートメントの左下隅に小さなヒントが表示され、「 in のメソッド スタブを生成する」ように提案されTakeOnlyInt16
ますProgram
。メソッドが明らかに既にそこにあるため、それは間違っています。しかし、すでに存在するオーバーロードは間違っていると考えているようです。short
とint
。z.
の中に (zed dot)と入力するMethod
と、 のメンバーがintellisenseInt32
で表示されます。のオーバーロードは、 によって宣言されたものではなく、によって宣言されたものであることに注意してください。また、入力すると、拡張メソッドが IntelliSense メンバー リストに表示されません。CompareTo
Int32
Int16
z.
スクリーンショットなしで私の説明を理解していただければ幸いです。
質問:このバグはどこから来たのですか? それはよく知られていますか?古いバージョンの Visual Studio にもありますか?
私はVS2013でこれを試しました。