C# 强制转换对字符串()的空字符引用

C# 强制转换对字符串()的空字符引用,c#,.net,C#,.net,在C#.net中,如果我获取一个字符串.Empty并在其上调用.FirstOrDefault(),以获取字符串的第一个字符,它将返回一个空字符引用,即\0,而不是一个空字符,即字符?。然后强制转换此ToString()的值与string.Empty的值不同 因此,根据我的测试,以下陈述似乎符合事实: string.Empty.FirstOrDefault().ToString()!=string.Empty ((char?)null.ToString()==string.Empty string

在C#.net中,如果我获取一个
字符串.Empty
并在其上调用
.FirstOrDefault()
,以获取字符串的第一个字符,它将返回一个空字符引用,即
\0
,而不是一个空字符,即
字符?
。然后强制转换此ToString()的值与
string.Empty的值不同

因此,根据我的测试,以下陈述似乎符合事实:

string.Empty.FirstOrDefault().ToString()!=string.Empty

((char?)null.ToString()==string.Empty

string.Empty.FirstOrDefault().ToString()='\0'.ToString()


是我一个人,还是感觉不一致?这对我一开始并不明显,我假设
string.Empty.FirstOrDefault().ToString()
将解析为与
string.Empty
相同的值。有人能把我链接到更深入地介绍这个问题的文档吗?

string
是一个
IEnumerable
,所以空字符串上的
FirstOrDefault()
返回
default(char)
,而不是
default(char?

默认值(字符)
'\0'

(几乎)不可能编写一个通用方法来处理引用类型,但返回值类型的
T?
(这是您在这里所期望的)

  • string.Empty
    =
    是长度为
    0
    的字符数组
  • string.Empty.FirstOrDefault()
    default(char)
    ,它是
    '\0'
    FirstOrDefault
    如果源为空,则返回
    default(T)
  • string.Empty.FirstOrDefault().ToString()
    =
    默认值(char.ToString()
    =
    “\0”
  • char?
    可为
    null
    ,如果您检查
    ToString()
    实现是否可为
    null


  • 这意味着,
    ((char?)null.ToString()
    返回
    (或
    字符串.Empty
    )。

    字符串.Empty.FirstOrDefault()返回什么?你认为这是为什么?另外,创建一个名为
    bob
    的int空数组。
    bob.FirstOrDefault()
    会返回什么?为什么?是的,我知道,但是为什么
    '\0'.ToString()!=string.Empty
    ?我一只手拿着一个鸡蛋容器,里面没有鸡蛋。我有另一个鸡蛋容器,里面有一个鸡蛋,但那个鸡蛋没有蛋黄。那两个鸡蛋容器里的东西一样吗?我有一个没有字符的字符串。我有一个字符串,里面有一个(当然是奇数)字符。这两个字符串相等吗?文档并没有涵盖所有可能的人都无法理解的所有内容@Oxymoron。这里的问题是你的思维模式是错误的。你在问“为什么这两个不同的东西不相等”,奇怪的是,答案是它们不相等。“为什么一个可空字符的字符串与字符串.Empty的值不匹配”,因为
    string.Empty
    没有字符。您正在请求FirstOrDefault,并且正在返回
    default(char)
    (因为没有“First”)<代码>字符串.Empty!=“\0”
    @矛盾修饰法:是;这正是问题所在。让我直截了当地说吧——空字符的集合并不等于没有字符?@Oxymoron correct。空字符是一个字符。
    public override string ToString()
    {
      if (!this.hasValue)
        return "";
      return this.value.ToString();
    }