将空字符引用转换为字符串(ToString())

4
在C# .net中,如果我使用string.Empty并在其上调用.FirstOrDefault(),以获取字符串的第一个字符,则会返回空字符引用,即\0,而不是空字符,即char?。然后将其转换为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相同的值。有没有人能够链接我到更深入涵盖此陷阱的文档?

1
string.Empty.FirstOrDefault() 返回什么?你认为为什么会这样?同时,创建一个名为 bob 的空整数数组。bob.FirstOrDefault() 会返回什么,为什么? - mjwills
我明白你的意思,但是为什么 '\0'.ToString() != string.Empty 呢? - Oxymoron
1
我手里有一个蛋盒,里面没有鸡蛋。我手里还有另一个蛋盒,里面有一个没有蛋黄的鸡蛋。这两个蛋盒的内容相同吗?我有一个没有字符的字符串。我有一个字符串,其中有一个(诚然很奇怪的)字符。这两个字符串相等吗? - mjwills
2个回答

3

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

default(char)'\0'

几乎不可能编写一个通用方法来处理引用类型并对值类型返回T?(这是你在这里期望的结果)。


1
文档遗憾地没有涵盖每个可能的人都无法理解的所有内容@Oxymoron。问题在于你的心智模式是错误的。你问的是“为什么这两个不同的东西不相等”,而奇怪的答案是它们不相等。 - mjwills
1
为什么一个可空字符的字符串不会匹配一个空字符串的值,因为 string.Empty 没有任何字符。你正在请求 FirstOrDefault,并且得到了 default(char)(因为没有“First”)。string.Empty != "\0" - Rufus L
1
@Oxymoron:是的,那正是它的含义。 - SLaks
2
@Oxymoron 正确。空字符是一个字符。 - Rufus L
1
请阅读 https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/ @Oxymoron 的第一段。 - mjwills
显示剩余11条评论

3
  1. string.Empty表示长度为0的字符数组""
  2. string.Empty.FirstOrDefault()返回default(char),即'\0' (如果源为空,则FirstOrDefault<T>返回default(T))
  3. string.Empty.FirstOrDefault().ToString()等同于default(char).ToString(),即"\0"
  4. char?Nullable<char>,如果您检查NullableToString()实现
public override string ToString()
{
  if (!this.hasValue)
    return "";
  return this.value.ToString();
}

这意味着,((char?)null).ToString() 返回 ""(或者string.Empty)。

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