编译器说我不能获取值类型的只读字段的地址

时间:2013-07-08 03:31:08

标签: c# unsafe value-type addressof

我有一个结构:

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

我以为我可以拿到田地的地址?发生了什么事?

2 个答案:

答案 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之外,它将返回相同的值。 这是一个可怕的黑客,但它实现了你想要的东西 - 只读值可以指示。