为什么空字符串不是字符串对象

本文关键字:字符串 对象 为什么 | 更新日期: 2023-09-27 18:21:24

考虑以下代码:

  class Program
        {
            static void Main(string[] args)
            {
                string s = null; 
                bool b = s is string;
                Console.WriteLine(b);
            }
        }

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

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

编译器为什么会有这种行为?

为什么空字符串不是字符串对象

在评估语句时,运行时必须首先跟随变量所引用的引用。只有这样,它才能评估被引用的对象,以确定它是否确实是一个字符串。

由于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/

变量s是一个可能指向字符串在内存中的位置的引用,但您还没有将其指向字符串-它指向"null"。当你问s is string时,你说的是"引用s是否指向内存中字符串的位置",在你的情况下,答案是"否"。

null关键字是一个表示null引用的文字,不引用任何对象

http://msdn.microsoft.com/en-us/library/edakx9da.aspx

s is string为false,因为s没有引用string的实例-s为null。