C# 引用结构中的委托赋值

问题描述 投票:0回答:1

我试图根据某些条件有条件地在 ref 结构内部定义委托。这适用于常规结构和类的内部,但由于某种原因,引用结构不允许这样做。

我得到了通用的“Method1”没有重载与委托“CreateInstance”匹配

同样,这适用于常规结构和类......为什么不在 ref 结构中?

public ref struct MyRefStruct<T>
{
    delegate T MyDelegate(ReadOnlySpan<string> span);
    
    MyDelegate _creator;

    public MyRefStruct()
    {
         _creator = myCondition ? Method1 : Method2;
    }

    T Method1(ReadOnlySpan<T> span) { //...omitted }
    T Method2(ReadOnlySpan<T> span) { //...omitted }
}
c# .net .net-core
1个回答
0
投票

ref struct
的实例方法不能用于方法组转换。

来自语言规范

如果在以下任何上下文中使用引用结构类型,则会出现编译时错误:

  • ...
  • ref struct
    类型的实例方法不得通过方法组转换为委托类型来捕获。
  • ...

这些约束确保

ref struct
类型的变量不会引用不再有效的堆栈内存,或不再有效的变量。

回想一下,

ref struct
始终存在于堆栈中,并且不会逃逸到堆中。考虑

class Foo {
    public MyRefStruct<T>.MyDelegate f;

    public void M() {
        var refStruct = new MyRefStruct<T>();
        f = refStruct._creator;
    }
}

假设我愿意

var foo = new MyRefStruct<int>.Foo();
foo.M();
foo.f(someSpan);

如果允许编译此代码,

foo.f
将引用在
refStruct
中创建的
M
局部变量的实例方法。但这个值不再有效,因为
M
已经返回了!

如果

Method1
/
Method2
然后访问
ref struct
的字段,它们也将访问不再有效的值。

对于常规结构和类,它们可以进入堆,因此可以存储在

Foo
的实例中。

© www.soinside.com 2019 - 2024. All rights reserved.