以下内容不编译。由于这不是匿名方法、lambda表达式或查询表达式,为什么这是一个限制?(以ref ReadOnlySpan的形式传递文本很好。)
void TestNestedSpan()
{
var text = "Some text".AsReadOnlySpan();
var success = TryParseS();
bool TryParseS()
{
//Compile Error CS8175 Cannot use ref local 'text' inside
// an anonymous method, lambda expression, or query expression
if (text.Length < 1 || text[0] != 'S')
return false;
text = text.Slice(1);
return true;
}
}
发布于 2018-04-04 15:38:01
编译器消息是不完整的,也应该提到本地函数。
修改诊断结果仍会让我感到“为什么这是一个限制?”
本地函数不能从外部范围引用类似于ref的结构,因为不需要在本地调用本地函数。
Action a;
void f() {
var s = "Hello, world!\n".AsReadOnlySpan();
void g() {
foreach (var c in s)
Console.Write(c);
}
a = g;
}
void h() {
a(); //call a which is in fact the "local" method g in f
}
你提到:
(以ref ReadOnlySpan的形式传递文本很好。)
这是正确的,但这改变了方法的签名。如果编译器要这样做,则不再可能将本地函数作为委托类型传递。
如评论中所述:
对本地函数进行不同的转换是可能的,这实际上将允许这样的本地函数不被分配给Action
。
Action a;
ref struct S {
public ReadOnlySpan<char> s;
public void g() {
foreach (var c in s)
Console.Write(c);
}
}
void f() {
S s;
s.s = "Hello, world!\n".AsReadOnlySpan();
s.g(); // okay
a = s.g; // error
}
实际上,这可能是一个好主意,可以将其作为C#的未来扩展。然而,在这个时候,它还没有被设计或实现。在允许这样做之前,需要考虑几个角落情况,例如当有多个本地函数时,捕获中有一些重叠。
https://stackoverflow.com/questions/49654145
复制相似问题