Michał Piaskowski desencadena la siguiente explicación:
La semántica de i--
en C# son para devolver el valor actual de i
(es decir, el valor antes de la disminución se produce) y luego decremento i
por uno.
Por lo tanto, tenemos que convertir eso a VB. No podemos usar i -= 1
porque esto no devuelve el valor actual de i
antes de la disminución. Por lo tanto, necesitamos una operación que va a disminuir i
pero devolver el valor de i
antes de la reducción, algo así como:
Function DoPostDecrement(ByRef i As Integer) As Integer
i -= 1
Return i + 1
End Function
Pero esto sugiere utilizar el siguiente para evitar tener que escribir un método para llevar a cabo lo anterior:
System.Math.Max(
someValueThatIsEqualToiMinusOne,
someValueThatIsEqualtoiBeforeTheDecrement
)
Pero VB.NET no le permitirá utilizar i -= 1
o i = i - 1
en lugar de someValueThatIsEqualToiMinusOne
. Sin embargo, System.Threading.Interlocked.Decrement(i)
es legítimo e igual al valor de i - 1
. Una vez hecho esto, ya que los parámetros se evalúan de izquierda a derecha, someValueThatIsEqualtoiBeforeTheDecrement
debería ser i + 1
(en ese momento el decremento se ha realizado para i + 1
es el valor de decremento previo.
Tenga en cuenta que el método anterior DoPostDecrement
y el constructo System.Math.Max, System.Threading.Interlocked.Decrement
podía tienen semánticas diferentes en un contexto multiproceso.
Hace esto en variables locales y no usa el valor devuelto de Math.Max (). Ese es un convertidor crummy. –