为什么不允许通过 '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 ref
s,并且你想访问它的元素而不复制整个结构。所以 ref readonly SomeLargeStruct x = ref someReadOnlySpanOfSomeLargeStruct[0]
.
我很好奇,为什么这个有效...
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 ref
s,并且你想访问它的元素而不复制整个结构。所以 ref readonly SomeLargeStruct x = ref someReadOnlySpanOfSomeLargeStruct[0]
.