考虑以下代码:
static void Main()
{
int? a = new int?(12); // warning CS0219: The variable 'a' is assigned but its value is never used
int? b = 12; // warning CS0219: The variable 'b' is assigned but its value is never used
int? c = (int?)12; // (no warning for 'c'?)
}
三个变量a
,b
和c
实际上是等价的。在第一个中,我们明确地在Nullable<>
上调用公共实例构造函数。在第二种情况下,我们使用从T
到T?
的隐式转换。在第三种情况下,我们明确地编写了转换。
我的问题是,为什么Visual C#5.0编译器(来自VS2013)不会像对前两个变量那样发出c
的警告?
在所有三种情况下生成的IL代码都是相同的,包括Debug(无优化)和Release(优化)。
不确定语言规范是否涵盖此警告。否则,C#编译器“有效”就像这样不一致,但我想知道原因是什么。
PS!如果有人更喜欢var
关键字,那么编写var c = (int?)12;
实际上是合理的,其中需要使用强制语法来var
工作如预期的那样。
PPS!我知道在int? neverUsed = MethodCallThatMightHaveSideEffects();
等情况下不会发出警告,请参阅another thread。