C# 为什么ref结构不能用作类型参数?
C#7.2C# 为什么ref结构不能用作类型参数?,c#,c#-7.2,ref-struct,C#,C# 7.2,Ref Struct,C#7.2ref-structs。但是,给定如下的ref结构: public ref struct Foo { public int Bar; } 我不能将其用作类型参数: int i = 0; var x = Unsafe.As<int, Foo>(ref i); // <- Error CS0306 The type 'Foo' may not be used as a type argument. inti=0; var x=不安全。如(参考i);// 不能将引用
ref-struct
s。但是,给定如下的ref结构
:
public ref struct Foo {
public int Bar;
}
我不能将其用作类型参数:
int i = 0;
var x = Unsafe.As<int, Foo>(ref i); // <- Error CS0306 The type 'Foo' may not be used as a type argument.
inti=0;
var x=不安全。如(参考i);// 不能将引用结构用作类型参数,因为它们无法转义到堆。没有任何机制可以告诉编译器方法承诺永远不会滥用引用结构
从C#7.2开始,您可以在声明中使用ref修饰符
结构类型的。ref结构类型的实例在上分配
堆栈,无法转义到托管堆。为确保:
编译器对ref结构类型的使用限制如下:
- ref结构不能是数组的元素类型
- ref结构不能是类或非ref结构的字段的声明类型
- ref结构无法实现接口
- ref结构不能装箱到System.ValueType或System.Object
- ref结构不能是类型参数
- lambda表达式或局部函数无法捕获ref struct变量
- ref结构变量不能在异步方法中使用。但是,您可以在同步方法中使用ref struct变量,例如,
在那些返回任务或任务
- ref结构变量不能在迭代器中使用
通用方法在另一个程序集中。它可以做任何数量的事情,你们不能用ref结构来做。编译器无法在整个程序分析之外验证您所说的方法。我猜这样的分析被认为是禁止的,因为它不能安全地进行,所以是不允许的。