考虑以下代码:
class Program
{
static void Main(string[] args)
{
string s = null;
bool b = s is string;
Console.WriteLine(b);
}
}
在上面的代码s is string
中,但b是false
。
实际上是字符串,为什么我得到这个结果?
为什么编译器有此行为?
答案 0 :(得分:4)
在评估语句时,运行时必须首先跟随变量引用的引用。只有这样才能评估引用的对象以确定它是否确实是一个字符串。
由于null
引用不引用任何对象,因此它不是字符串。事实上,它什么都没有。
您可以使用typeof
运算符来获取与字符串对应的Type
对象,而不是比较引用的对象,如果这是您的最终目标。
这实际上是Eric Lippert在关于这个主题的博客文章中给出的一个特例:
我注意到is运算符在C#中是不一致的。看看这个:
string s = null; // Clearly null is a legal value of type string bool b = s is string; // But b is false!
这是怎么回事?
- http://ericlippert.com/2013/05/30/what-the-meaning-of-is-is/
答案 1 :(得分:1)
变量s
是一个可以指向内存中字符串位置的引用,但是你还没有将它指向一个字符串 - 它指向'null'。当你问s is string
时你说'引用s
是否指向内存中字符串的位置',在你的情况下答案是'否'。
答案 2 :(得分:0)
null关键字是表示空引用的文字,不引用任何对象。
http://msdn.microsoft.com/en-us/library/edakx9da.aspx
s is string
为false,因为s
未引用string
的实例 - s
为空。