Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VisualStudio2008编译器异常警告,需要解释_C#_Visual Studio 2008 - Fatal编程技术网

C# VisualStudio2008编译器异常警告,需要解释

C# VisualStudio2008编译器异常警告,需要解释,c#,visual-studio-2008,C#,Visual Studio 2008,只需向VisualStudio 2008的编译器提出一个简短的问题 我们确实启用了将编译器警告视为错误处理的功能,但今天我认识到以下行为: static void Main(string[] args) { int number = 0; DateTime dateTime = DateTime.Now; } 编译此代码段只会导致一条警告:“已分配变量'number',但从未使用其值” 有人能给我解释一下区别吗?为什么变量编号导致错误,而不是日期时间变量 好的,它似乎和文字有关

只需向VisualStudio 2008的编译器提出一个简短的问题

我们确实启用了将编译器警告视为错误处理的功能,但今天我认识到以下行为:

static void Main(string[] args)
{
    int number = 0;
    DateTime dateTime = DateTime.Now;
}
编译此代码段只会导致一条警告:“已分配变量'number',但从未使用其值”

有人能给我解释一下区别吗?为什么变量编号导致错误,而不是日期时间变量

好的,它似乎和文字有关。考虑到以下代码:

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

尽管变量“str2”从未被引用,但使用这两行编译不会导致任何警告。如果注释掉行
string str2=str1对于从未使用过的变量“str1”显示警告。

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

这是因为DateTime.Now是一个属性,而不是文字。属性获取程序可能有副作用,只需调用一个就可以了。这并不是一个好主意,但是这样做是不可能的,而且编译器也没有足够的智能来判断它是否这样做。无论如何,它不能,它最终会调用操作系统代码来获取当前系统时间。

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

埃里克·利珀特(Eric Lippert)在这篇文章中写道,因此我将让他来解释:

通常情况下,C#警告所有变量和 永远不会读取的字段,永远不会 但在这种情况下,我们 如果出现以下情况,则故意抑制警告: 赋值不是常数 表情

这是因为没有好办法 在VisualStudio调试器中 “显示最后一个的返回值 函数调用”。虽然我同意 你是否明智地指出了这一点 解决这个问题的方法是修复 调试器,考虑到我没有能力 为了解决这个问题,我们需要一个C语言的解决方案# 为了我们的客户


有关详细说明,请参阅文章。

此外,警告还明确指出“变量‘number’让我感到困扰的是,它只适用于未使用的整数,但DateTime也不使用……好吧,Eric Lippert的那篇文章回答了我为什么VS会抑制警告。这只是为了让调试更容易。这就解释了为什么DateTime没有警告。现在,但对于仍然没有被引用的变量“DateTime”没有警告。尝试调用DateTime。现在不调用属性getter。不,这不是问题,它甚至可能是一个DateTime文本。只是,编译器不会抱怨没有使用变量“dateTime”,就像它抱怨变量“number”一样。我不确定我是否理解,文字日期时间是什么样子的?要调用属性getter,必须在表达式中使用它。例如,赋值语句的rhs。鉴于依赖getter的副作用是合法的,使用赋值语句也必须是合法的。如果那样做是违法的,你就必须跳出非常古怪的圈套,无论如何都要打电话给能手。试试看。同样的想法,指定一个参考也有副作用。现在来看垃圾收集器。有趣的是,有一种方法可以确定调试器中异常(
$exception
)的值。因此,
catch(Exception ex)
将在从未引用
ex
时发出警告。+1表示链接。这是对其他答案的一个很好的补充。感谢您在回答中引用了适用的部分。我希望有更多的人效仿这个榜样。