Visual Studio 2008奇怪的编译器警告,需要解释

时间:2011-01-10 12:34:52

标签: c# visual-studio-2008

只是对VisualStudio 2008编译器的快速提问。

我们确实已经启用了编译器警告被视为错误的工作正常,但今天我认识到,以下行为:

static void Main(string[] args)
{
    int number = 0;
    DateTime dateTime = DateTime.Now;
}

编译此代码段只会产生一个警告:“已分配变量'number',但永远不会使用其值。”

任何人都可以向我解释这个差异,为什么变量数会导致错误,而不是dateTime变量?

好吧,它似乎与文字有关。考虑以下代码:

static void Main(string[] args)
{
    string str1 = "Foo";
    string str2 = str1;
}

使用两行进行编译都不会发出警告,但永远不会引用变量“str2”。如果您注释掉行string str2 = str1;,则警告显示变量“str1”从未使用过。

4 个答案:

答案 0 :(得分:5)

这是因为DateTime.Now是一个属性,而不是文字。属性getter可能有副作用,简单地调用一个可能是有用的。并不是说这是一个好主意,但它不是 verboten 这样做,并且编译器不够聪明,无法判断它是否存在。无论如何,它最终都会调用操作系统代码来获取当前系统时间。

答案 1 :(得分:3)

我的猜测是语句int number = 0;完全没有副作用,可以被编译器识别为多余的。另一方面,DateTime dateTime = DateTime.Now;是对静态属性的评估,可能会执行其他代码,因此编译器不会将其标识为未使用的变量。换句话说,虽然变量可能未被使用,但分配它的行为可能会做其他事情。

答案 2 :(得分:2)

Eric Lippert在此写了an article,所以我会留给他解释一下:

  

通常C#会警告所有变量和   永远不会读的字段   写的等等。但在这种情况下我们   如果有意的话,有意抑制警告   赋值不是常数   表达。

     

这是因为没有好办法   在Visual Studio调试器中说   “告诉我最后的回报价值   函数调用“。虽然我同意   你明智地指出了吗?   解决这个问题的方法是解决这个问题   调试器,因为我没有能力   解决它,我们需要一个C#的解决方案   为我们的客户。

有关进一步说明,请参阅文章。

答案 3 :(得分:-3)

DateTime.Now是一个参考。我可能错了,因为我没有C#的经验,但我不认为你在使用DateTime.Now时创建一个新对象。