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

C# 为什么空字符串不是字符串对象,c#,string,C#,String,考虑以下代码: class Program { static void Main(string[] args) { string s = null; bool b = s is string; Console.WriteLine(b); } } 在上面的代码中,s是string,而b是fa

考虑以下代码:

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

                string s = null; 
                bool b = s is string;
                Console.WriteLine(b);
            }
        }
在上面的代码中,
s是string
,而b是
false

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


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

变量
s
是一个引用,可能会指向内存中字符串的位置,但是您还没有将它指向字符串-它指向“null”。当您询问
s is string
时,您说的是“引用
s
是否指向内存中字符串的位置”,而您的回答是“否”

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


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

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

由于
null
引用未引用任何对象,因此它不是字符串。事实上,这根本算不了什么

您可以使用
typeof
操作符获取与字符串对应的
Type
对象,而不是比较引用的对象(如果这是您的最终目标)

这实际上是Eric Lippert在一篇关于这个主题的博客文章中给出的一个特殊例子:

我注意到C#中的is运算符不一致。看看这个:

string s = null; // Clearly null is a legal value of type string
bool b = s is string; // But b is false!
怎么回事


--
s
不是字符串,而是空引用。如果它引用了某个东西,那么该东西将是一个字符串。然而'bool b=typeof(s)是字符串;'将产生预期的结果我不会得到null referenceRead by Eric Lippert:)英语中的
is
和C#编程语言中的
is
之间存在差异。我不认为
typeof
操作符在这种情况下会有什么帮助。@m-y如果OP正在查找
Type
字符串的对象,他可以使用
typeof
而不是
is
运算符。