首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Span<T>不能是嵌套局部变量。为什么这是个限制?

Span<T>不能是嵌套局部变量。为什么这是个限制?
EN

Stack Overflow用户
提问于 2018-04-04 14:51:56
回答 1查看 2.2K关注 0票数 2

以下内容不编译。由于这不是匿名方法、lambda表达式或查询表达式,为什么这是一个限制?(以ref ReadOnlySpan的形式传递文本很好。)

代码语言:javascript
运行
复制
    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;
        }
    }
EN

Stack Overflow用户

回答已采纳

发布于 2018-04-04 15:38:01

编译器消息是不完整的,也应该提到本地函数。

修改诊断结果仍会让我感到“为什么这是一个限制?”

本地函数不能从外部范围引用类似于ref的结构,因为不需要在本地调用本地函数。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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#的未来扩展。然而,在这个时候,它还没有被设计或实现。在允许这样做之前,需要考虑几个角落情况,例如当有多个本地函数时,捕获中有一些重叠。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49654145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档