Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't a C# structure return a reference to its member field?

Tags:

c#

struct Foo {
    int i;
    public ref int I => ref i;
}

This code raises compile error CS8170, but if Foo is a class, it doesn't. Why can a structure not return a member as a reference?

like image 242
20chan Avatar asked Mar 09 '18 07:03

20chan


1 Answers

I think I found a way around it:

class Program
{
    static void Main(string[] args)
    {
        Foo temp = new Foo(99);
        Console.WriteLine($"{Marshal.ReadInt32(temp.I)}");
        Console.ReadLine();
    }
}
struct Foo
{
    int i;
    public IntPtr I;

    public Foo(int newInt)
    {
        i = newInt;
        I = GetByRef(i);
    }
    static unsafe private IntPtr GetByRef(int myI)
    {
        TypedReference tr = __makeref(myI);
        int* temp = &myI;
        IntPtr ptr = (IntPtr)temp;
        return ptr;
    }
}

Not that its a good idea- too many dire warnings. However, I do believe it is achieving what you want by returning a reference to the struct member, which you can then marshal to get the original value.

like image 190
daniel_sweetser Avatar answered Oct 30 '22 10:10

daniel_sweetser