我有一个结构:
struct S {
public readonly int Value1;
public readonly int Value2;
public S(int value1, int value2) {
this.Value1 = value1;
this.Value2 = value2;
}
}
我尝试获取Value2的地址:
var s = default(S);
unsafe {
var r = new IntPtr(&s.Value2);
}
但是我收到编译错误:
Cannot take the address of the given expression
我以为我可以拿到田地的地址?发生了什么事?
答案 0 :(得分:2)
显然它不适用于只读字段。将S更改为:
struct S {
public int Value1;
public int Value2;
}
解决了这个问题。
答案 1 :(得分:2)
有意义的是,readonly值不能指向它,因为它的值可以通过取消引用指针来改变,这将有效地破坏其readonly质量。
但是,我有一个解决方案,但你可能不喜欢它。
首先,将字段设为私有和非只读。 其次,通过get-only属性使它们可访问。 第三,添加将int指针返回到非readonly字段的属性。
作为示范:
struct S
{
private int value1;
private int value2;
public S(int value1, int value2)
{
this.value1 = value1;
this.value2 = value2;
}
public int Value1 { get { return value1; } }
public int Value2 { get { return value2; } }
public unsafe IntPtr Value1Ptr
{
get
{
fixed (int* ptr = &value1)
{
return new IntPtr(ptr);
}
}
}
public unsafe IntPtr Value2Ptr
{
get
{
fixed (int* ptr = &value2)
{
return new IntPtr(ptr);
}
}
}
}
我还测试过,如果你将字段设为public并尝试将指针放在struct之外,它将返回相同的值。 这是一个可怕的黑客,但它实现了你想要的东西 - 只读值可以指示。