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

时间:2015-09-02 00:50:11

标签: c# .net pointers properties unsafe

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

然后没有产生语法错误。

是否有这样的原因,或者是编译器的问题?我理解指针类型属性并不常见,但我仍然不明白为什么这是语法错误而不是语义错误,假设出现了错误用代码。

1 个答案:

答案 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 ..表格。

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