我最近在C#中编写了一些不安全的代码,并注意到这会产生语法错误:
public unsafe class UnsafeByteStream
{
public UnsafeByteStream(int capacity)
{
this.Buffer = stackalloc byte[capacity];
}
public byte* Buffer { get; }
}
结果是:"Invalid expression term 'stackalloc' / ; expected / } expected"
。但是,当我首先将其分配给本地字段时,如下所示:
public UnsafeByteStream(int capacity)
{
byte* buffer = stackalloc byte[capacity];
this.Buffer = buffer;
}
然后没有产生语法错误。
是否有这样的原因,或者是编译器的问题?我理解指针类型属性并不常见,但我仍然不明白为什么这是语法错误而不是语义错误,假设出现了错误用代码。
答案 0 :(得分:3)
stackalloc
必须成为本地变量声明的一部分,如discussed in the documentation。
[stackalloc]关键字仅在本地变量初始值设定项 中有效。以下代码会导致编译器错误。
int* block; // The following assignment statement causes compiler errors. You // can use stackalloc only when declaring and initializing a local // variable. block = stackalloc int[100];
因此它确实是语法错误;并拒绝obj.Property = stackalloc ..
表格。
(后来对属性的赋值是 - 未捕获 - 语义错误。)