我试图根据某些条件有条件地在 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 }
}
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
的实例中。