为什么 null 字符串不是一个字符串对象?

8

考虑以下代码:

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

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

在上面的代码中,s是字符串,但b是false

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

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


6
s 不是一个字符串,它是一个空引用。如果它引用了某些东西,那个东西就会是一个字符串。 - Roger Rowland
3
然而,“bool b = typeof(s) is string;”将产生预期的结果。 - Robert
不,我没有遇到空引用异常。 - user1968030
2
阅读Eric Lippert的文章 What the meaning of is is :) - DaveShaw
1
英语中的“is”和C#编程语言中的“is”是有区别的。 - Ahmed KRAIEM
显示剩余3条评论
3个回答

4
评估语句时,运行时首先必须跟随变量引用的引用。只有在此之后,它才能评估所引用的对象以确定它是否确实是字符串。
由于 null 引用不引用任何对象,因此它不是字符串。事实上,它什么都不是。
如果您的最终目标是获取对应于字符串的 Type 对象,而不是比较引用的对象,则可以使用 typeof 运算符。
这实际上是 Eric Lippert 在一篇关于此主题的博客文章中给出的特定示例。

I've noticed that the is operator is inconsistent in C#. Check this out:

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

What's up with that?

-- http://ericlippert.com/2013/05/30/what-the-meaning-of-is-is/

这篇文章从it技术角度讲解了“is”这个词在c#语言中的含义。文章指出,"is" 用于比较两个对象间是否具有相同的类型或者是一个对象是否派生自另一个类。同时,文章也强调了区分"="和 "is"的不同之处。

我不认为 typeof 运算符在这种情况下有任何帮助。 - myermian
3
如果 OP 想要获取字符串的 Type 对象,可以使用 typeof 而不是 is 运算符。 - David Pfeffer

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接