C# 为什么ref结构不能用作类型参数?

C# 为什么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);// 不能将引用

C#7.2
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结构来做。编译器无法在整个程序分析之外验证您所说的方法。我猜这样的分析被认为是禁止的,因为它不能安全地进行,所以是不允许的。