public class Program
{
public static void main(String[] args)
{
string message = "This is a message";
int number = 6;
object obj = null;
int? nullable = (int?)12;
}
}
此程序的前三个变量声明会发出以下警告:
变量'X'已分配,但其值从未使用
然而,最后一句话:
int? nullable = (int?)12;
不会抛出任何东西。那是为什么?
答案 0 :(得分:4)
只有在编译器可以证明用于初始化变量的表达式不会导致任何副作用的情况下,才会显示您所看到的警告。当您只是为变量分配文字字符串,整数或null
值时,编译器知道这些事情都不会导致副作用。对于你的最后一个值,你不只是分配一个文字值;你也在使用类型的显式运算符,就编译器而言,该运算符只是一些可以执行任何的代码。例如,它可能会导致相关的副作用(它没有,但编译器不知道)会使这条线不是多余的。
答案 1 :(得分:0)
警告是最佳做法建议,它们不是真正的错误。 Visual Studio非常聪明,可以看到你创建了变量,但从未使用过它们,因此它们毫无用处。因为你不使用它们,所以建议你摆脱它们。
如果你真的对它们做了些什么,那么错误就会消失。例如,如果你说:
number += nullable;
将摆脱1个错误。如果你做了类似的事情:
message = message + " and this is more message";
它会摆脱另一个错误。
我相信它看到了int?作为一个对象,因为你将它转换为可空变量,它无法弄清楚它是否已被预先使用过。我认为它与渲染有关的事情并没有被捕获为错误,因为它无法判断你是否在其他地方引用了该变量。
我认为这相当于这样的事情:
var a = new SomeClass();
var b = a;
由于它无法判断 a 是否真的被使用过,因此它不会显示错误。如果你把它放在真正的类中,它也不会显示错误。
答案 2 :(得分:0)
似乎警告没有显示,因为具有可空的行实际上在分配之前执行了操作。例如,以下代码仅对名为number的变量生成警告。这似乎是合乎逻辑的,因为带有警告的行在当前代码中实际上是无用的。其他行可能在执行期间执行某些操作,并且不会“优化”。要测试它在发布模式下使用调试器广告运行代码,您将看到所有带有警告的行都被跳过(“优化”)
class Program
{
static void Main(string[] args)
{
string message = ';'.ToString();
int number = 6;
object obj = (object)(new t());
int? nullable = (int?)12;
}
class t
{ }
}
有了这个说法。可以为空的它没有优化,因为从int'12'到int?的转换。由于它是真正的演员,而不是“无用演员”,因此在运行期间需要进行操作。