I was decompiling an open-source project (because the source for the latest version hasn't been released yet). Using RedGate's Reflector tool, it gave me this block of code:
if(somecondition == true)
{
ref Vector3i vectoriRef;
float num17 = length - num;
Vector3i end = vectori3;
(vectoriRef = (Vector3i) &end)[1] = vectoriRef[1] - ((int) num17);
}
somecondition
is a boolean. length
and num
are floats defined outside the code. vectori3
is also defined outside the code and is of type Vector3i. The type Vector3i is essentially this code , but with x, y, and z stored as integers.
When I try to compile this decompiled code, I get the following errors:
Any thoughts on how I can fix this code so it compiles correctly and does whatever it was intended to do?
UPDATE: It turns out the source is available in their repository, but you have to follow a maze of links and clues to even find it. Thanks to everyone who posted!
The code uses a mutable value type, which is a "worst practice" in C#. The code that we generate for mutable value types can be quite difficult to correctly analyze and decompile; apparently you have run into a bug in the decompilation engine. C# does not support the given syntax. (It could in the future; I have written a prototype of "ref locals" and it works quite nicely, but it is not clear that the feature is actually valuable enough to customers to warrant a full design and implementation.)
Read the code carefully and you'll see what it is doing: it's making a copy of vectori3 into end, then obtaining a ref to end (remember, the "this" of a call to a value type is always a ref to a variable because the call might be mutating the contents of that variable.) Then its using the ref to mutate the variable. But why?? This code doesn't make any sense . Why would you make a local copy of a variable and then mutate the copy, and then discard the mutated copy?
I suspect that you've not only found a bug in the decompiler; you may have also found a bug in the code.
At first glance
if (somecondition)
{
vectori3[1] -= (int)(length - num);
}
I'm not clear about the explicit reference syntax - I've never seen that before, and can't get VS to accept it - but the last line splits out into
vectoriRef = (Vector3i) &end;
vectoriRef[1] = vectoriRef[1] - ((int) num17);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.