为什么 'stackalloc' 关键字不能用于属性?

Why does the 'stackalloc' keyword not work with properties?

我最近在用 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;
}

那么就没有产生语法错误了。

这是有原因的,还是编译器出了问题?我知道指针类型的属性并不是那么常见,但我仍然不明白为什么这是 syntax 错误而不是 semantic 一,假设代码有问题。

stackalloc 必须是局部变量声明的一部分,如discussed in the documentation.

The [stackalloc] keyword is valid only in local variable initializers. The following code causes compiler errors.

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 .. 形式。

(后来对 属性 的赋值是一个未捕获的语义错误。)