我最近在用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;
}
这样就不会产生语法错误。
是有原因的,还是编译器有问题?我知道指针类型的属性并不是那么普遍,但是我仍然不明白为什么这是一种语法错误而不是语义错误,并假设代码有问题。
最佳答案
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 ..
形式。(后来分配给属性是一个未捕获的语义错误。)