为什么'stackalc '关键字不能与属性一起工作

本文关键字:属性 一起 工作 关键字 stackalc 为什么 不能 | 更新日期: 2023-09-27 18:10:50

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

则不产生语法错误。

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

为什么'stackalc '关键字不能与属性一起工作

stackalloc 必须是局部变量声明的一部分,如文档中所述。

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

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