【问题标题】:Why does the 'stackalloc' keyword not work with properties?为什么“stackalloc”关键字不适用于属性?
【发布时间】:2015-09-02 00:50:11
【问题描述】:

我最近在 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 错误,假设有问题用代码。

【问题讨论】:

    标签: c# .net pointers properties unsafe


    【解决方案1】:

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

    [stackalloc] 关键字仅在局部变量initializers 中有效。以下代码会导致编译器错误。

    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 .. 表单。

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

    【讨论】:

    • 哦,这就是的原因。我怀疑它与 UnsafeByteStream 在堆上分配有关,因为它是一个类,因此它不能保存 stackalloc'd 字节数组......有时当你想得太远时,你不会看看你面前有什么。
    • @JamesKo 这是一个有趣的问题; (神秘的)语法错误让我措手不及。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多