struct Foo {
int i;
public ref int I => ref i;
}
Этот код вызывает ошибку компиляции CS8170, но если Foo
является классом, это не так. Почему структура не может вернуть элемент в качестве ссылки?
struct Foo {
int i;
public ref int I => ref i;
}
Этот код вызывает ошибку компиляции CS8170, но если Foo
является классом, это не так. Почему структура не может вернуть элемент в качестве ссылки?
Я думаю, что нашел способ обойти это:
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;
}
}
Не то чтобы это хорошая идея — слишком много страшных предупреждений. Тем не менее, я считаю, что вы достигаете того, чего хотите, возвращая ссылку на элемент структуры, который затем можно маршалировать, чтобы получить исходное значение.
this
, но согласно спецификациям,this
будет означать копию структуры, что делает аргументlives on stack
(дляthis
) недействительным. См.: docs.microsoft. com/en-us/dotnet/csharp/language-reference/ - person Stefan   schedule 09.03.2018