为什么 '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 ..
形式。
(后来对 属性 的赋值是一个未捕获的语义错误。)
我最近在用 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 ..
形式。
(后来对 属性 的赋值是一个未捕获的语义错误。)