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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top