为什么null string不是字符串对象

时间:2013-07-08 12:43:20

标签: c# string

考虑以下代码:

  class Program
        {
            static void Main(string[] args)
            {

                string s = null; 
                bool b = s is string;
                Console.WriteLine(b);
            }
        }

在上面的代码s is string中,但b是false

实际上是字符串,为什么我得到这个结果?

为什么编译器有此行为?

3 个答案:

答案 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为空。