考虑以下简单程序:
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
。它似乎认为它实际上是一个z
(在 C# 中又名)。问题至少在三种情况下表现出来:Int32
Int16
short
当您“悬停”在(将鼠标悬停在)
var
关键字上时,它会Int32
在工具提示中显示您。那是错的。当您将文本(键盘)光标移动到语句
TakeOnlyInt16(z);
inside 内Method
时,它会在该语句的左下角显示一个小提示,提供“为TakeOnlyInt16
in生成方法存根Program
”。这是错误的,因为该方法显然已经存在。但似乎认为已经存在的过载是错误的。short
和int
。当你
z.
在里面输入 (zed dot)Method
时,成员就会Int32
出现在intellisense中。请注意, 的重载CompareTo
是由 声明的重载,Int32
而不是由声明的重载Int16
。此外,当您键入时,智能感知成员列表中缺少扩展方法z.
。
希望您在没有屏幕截图的情况下理解我的解释。
问题:这个错误来自哪里?它是众所周知的吗?它也在旧版本的 Visual Studio 中吗?
我在VS2013中试过这个。