【发布时间】:2018-03-30 11:27:11
【问题描述】:
struct Foo {
int i;
public ref int I => ref i;
}
此代码引发编译错误 CS8170,但如果 Foo 是一个类,则不是。为什么结构不能返回成员作为引用?
【问题讨论】:
-
由于值类型(结构)是在堆栈上分配的,一旦变量超出范围,为其成员之一返回的引用将变为无效,因此此错误对代码安全有意义。
-
@BradleySmith - 请停止重复这种疲惫且通常不正确的陈述。结构有时在堆栈上分配。有很多次他们不是。
-
当然,它们可能被分配在堆栈上的事实足以解释编译器错误,虽然?
-
真正理解 ref 返回限制需要理解指针。指针是危险的,一种赋予它们不受限制的能力的语言的标准编程错误是使用不再寻址有效内存位置的指针。 C# 不是这样的语言,编译器强制执行确保此类错误永远不会蔓延的语法。另一个要求是它需要确保垃圾收集器可以正确发现指针指向的内容,这是更大的问题sn-p。 en.wikipedia.org/wiki/Dangling_pointer
标签: c#