8

考虑这段代码:

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

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

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

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

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

4

3 回答 3

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/

于 2013-07-08T12:48:32.243 回答
1

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

于 2013-07-08T12:46:15.963 回答
0

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

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

s is string为假,因为s不引用string-的实例s为空。

于 2013-07-08T12:46:19.880 回答