I have the following code:
List<IMessage> messageList = new List<IMessage>();
foreach(var msg in messageList)
{
if(msg != null)
{
}
}
如何检查
var
msg是否为null
?编译器如何知道var
是一个IMessage
而不是一个int
或其他不可空类型?如果您查看MSDN上的示例,它们会为隐式类型变量提供初始值(从而使声明变为显式)。在我的情况下,我甚至没有给它赋值,但编译器没有问题。编译器如何知道msg
是可空的?
messageList
是一个类型为IMessage
的项目列表,因此编译器可以轻松地推断出msg
的实际类型为IMessage
。如果编译器无法推断类型,则无法使用var
- 例如var msg;
将不被允许。 - stuartdnull
进行比较。如果msg
是一个int
,编译器会发出警告,因为比较总是为true
,但它不会被禁止。 - Jeroen Mostertnull
与值类型进行比较时,我会得到更多的警告。不确定你在说什么。 - Snoopvar i = 5; Console.WriteLine(i != null)
会产生 CS0472 错误。你可能已经将警告配置为错误。 - Jeroen Mostertbool f<T>(T t) { return t != null; }
,那么Console.WriteLine(f(5))
将会在编译时没有警告。从概念上讲,在 C# 中的所有东西都是对象,因此允许将其与null
进行比较。发出警告是因为在这个特定的情况下,比较结果总是相同的。 - Jeroen Mostert