为什么不允许通过 'ref' 从字符串中获取字符?

Why getting char by 'ref' from string is not allowed?

我很好奇,为什么这个有效...

static void Main(string[] args)
{
    ReadOnlySpan<char> text = "Hello";
    ref readonly char c = ref text[0];
}

...但是这个不允许吗?

static void Main(string[] args)
{
    string text = "Hello";
    // Error CS8156 An expression cannot be used in this context because it may not be passed or returned by reference
    ref readonly char c = ref text[0];
}

该限制是否有任何隐藏的技术原因?为什么 C# 不支持? (还没有?)

从技术上讲,因为字符串的索引器 returns a char, whereas ReadOnlySpan<T>'s indexer returns a ref readonly T

其中一个原因是 ref readonly return 仅添加到语言 in C# 7.2 中,与引入 ReadOnlySpan<T> 的版本相同。但是,string 自 C# 1 以来就一直在该语言中。更改字符串的索引器 returns 使其成为 return 而不是 ref readonly char 将是一个重大更改char.

更实际地说,return对 char 的引用是毫无意义的:ref 比 char 本身占用更多的内存!当你有一个大结构时,你通常想使用 readonly refs,并且你想访问它的元素而不复制整个结构。所以 ref readonly SomeLargeStruct x = ref someReadOnlySpanOfSomeLargeStruct[0].