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
运算符。