有些事情让我困惑,希望你能澄清。
// This class assumes that T is definitively compatible to TheStruct
class ValueHolder<T> {
T _value;
TheStruct _structValue;
void Test1() {
_structValue = ref Unsafe<T, TheStruct>(ref _value); // ERROR: _structValue is not a by-ref value
// _structValue = Unsafe<T, TheStruct>(ref _value); // WORKS: Copy from stack to heap
}
void Test2() {
ref var structValue = ref _structValue;
structValue = ref Unsafe.As<T, TheStruct>(ref _value); // WORKS: Why, and what implication does it have?
}
}
所以我的问题是在 Test2 中:为什么我可以在定义
ref var structValue = ref _structValue;
时指定 Unsafe.As 作为 ref。更重要的是,当使用它而不是 _structValue = Unsafe<T, TheStruct>(ref _value);
时,它会产生什么影响?
感谢您的阅读,希望您能为本文带来一些启发。 :)
为什么在定义 ref var structValue = 时可以将 Unsafe.As 指定为 ref 参考_structValue;
因为根据收到的错误,您需要一个 ref 局部变量:
CS8373 The left-hand side of a ref assignment must be a ref variable.
您可以省略中间步骤并执行它:
ref var structValue = ref Unsafe.As<T, TheStruct>(ref _value);
这和的区别
var structValue = Unsafe.As<T, TheStruct>(ref _value);
在第一种情况下,您
structValue
成为_value
的别名。
从现在开始,您可以在方法主体中将
_value
替换为 structValue
,它将具有相同的行为。
var foo = 42;
ref var bar = ref foo;
bar = 43; // it's as if we have written "foo = 43;"
Console.WriteLine(foo); // 43