Problema ao portar o código VB.NET para C #
Pergunta
Atualmente estou tentando porta algum código VB.NET para C #.
Os olhares struct como este em VB.NET:
Public Structure sPos
Dim x, y, z As Single
Function getSectorY() As Single
Return Math.Floor(y / 192 + 92)
End Function
Function getSectorX() As Single
Return Math.Floor(x / 192 + 135)
End Function
Function getSectorXOffset() As Int32
Return ((x / 192) - getSectorX() + 135) * 192 * 10
End Function
Function getSectorYOffset() As Int32
Return ((y / 192) - getSectorY() + 92) * 192 * 10
End Function
End Structure
C # Versão do struct:
public struct sPos
{
public float x;
public float y;
public float z;
public float getSectorY()
{
return (float)Math.Floor(y / 192 + 92);
}
public float getSectorX()
{
return (float)Math.Floor(x / 192 + 135);
}
public Int32 getSectorXOffset()
{
return (int)((x / 192) - getSectorX() + 135) * 192 * 10;
}
public Int32 getSectorYOffset()
{
return (int)((y / 192) - getSectorY() + 92) * 192 * 10;
}
}
Por que eu tenho para lançar os valores de retorno para flutuam & int? Na versão vb Eu não tenho a ..
Obrigado a todos.
Solução
Coloque um ()
após getXSectorOffset
porque é uma função?
exemplo:
nullPointX = pictureBox1.Width / 2 - sectorsize - centerPos.getSectorXOffset() / 10 * sectorsize / 192;
Quanto à segunda pergunta, você poderia evitar elenco para flutuar com esta modificação:
public float getSectorY()
{
return (float)Math.Floor(y / 192f + 92f);
}
E desculpe, você vai ter que elenco para int
ainda. A menos que você atire a x
e getXOffset()
para int
durante a função:
public Int32 getSectorXOffset()
{
return (((int)x / 192) - (int)getSectorX() + 135) * 192 * 10;
}
Outras dicas
Note que você não deve usar "Dim" na variáveis ??de nível de classe / estrutura. Sempre uso público, protegido, Private etc.
Observe também que a divisão funciona de maneira diferente em VB e C #. Em VB, se você dividir dois inteiros assim:
Dim r As Double = 5/2
Em seguida, r será um Duplo com valor de 2,5
Em C # no entanto, divisão com números inteiros dá-lhe inteiro resultados, 2 neste caso.
Se você definir Opção Strict On em seu código VB (que você realmente deveria sempre fazer), então eu acho que você precisa para lançar os valores de retorno em VB assim: Math.Floor () retorna um Double, e não um único, e você deve realmente dizer ao compilador que você queria perder essa precisão (que é o que o float) fundido (na versão C # faz) em vez de deixar o compilador jogue precisão embora sem você tomar uma decisão informada.