我最近在用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 ..形式。

(后来分配给属性是一个未捕获的语义错误。)

09-11 19:01