为什么不能在 C# 7.2 的结构中同时使用只读和固定大小的缓冲区

Fit*_*Dev 5 c# struct unsafe c#-7.2

随着 C# 7.2 的发布,现在可以使用readonly结构体,这在许多情况下可以提高性能。

对于我的结构之一,我使用固定大小的字节数组来实际保存数据。但是,当我标记struct和 字节数组字段时readonly,C# 编译器抱怨readonly该字段无效。为什么我不能在一个字段上同时拥有fixed和?readonlystruct

readonly unsafe struct MyStruct {
  readonly fixed byte _Value[6]; //The modifier 'readonly' is not valid for this item.
}
Run Code Online (Sandbox Code Playgroud)

Evk*_*Evk 1

因为 C# 规范是这么说的(而且总是这么说,甚至在 c# 7.2 之前也是如此)。fixed在名为“固定大小缓冲区声明”的 18.7.1 节中,缓冲区声明中允许使用以下修饰符:

新的

民众

受保护的

内部的

私人的

不安全

没有readonly这里。如果您考虑一下 - 无论如何它都没有多大意义,因为固定缓冲区大小由指针表示,并且您不能限制对指针的写访问。例如:

var s = new MyStruct();
byte* value = s._Value;
// how can you prevent writing to `byte*`?
Run Code Online (Sandbox Code Playgroud)