2009-09-10 6 views
0

Actuellement, j'essaie de porter du code VB.NET en C#.Problème lors du portage du code VB.NET en C#

Le struct ressemble à ceci dans 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# Version du 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; 
     } 
    } 

Pourquoi dois-je jeter les valeurs de retour pour flotter & int? Dans la version vb je n'ai pas à ..

Merci à tous.

Répondre

2

Mettez un () après getXSectorOffset parce que c'est une fonction?

exemple:

nullPointX = pictureBox1.Width/2 - sectorsize - centerPos.getSectorXOffset()/10 * sectorsize/192; 

En ce qui concerne la deuxième question, vous pourriez éviter CAST pour flotter avec cette modification:

public float getSectorY() 
    { 
     return (float)Math.Floor(y/192f + 92f); 
    } 

Et désolé, vous devrez jeter à int encore. À moins que vous lancez la x et getXOffset() à int au cours de la fonction:

public Int32 getSectorXOffset() 
    { 
     return (((int)x/192) - (int)getSectorX() + 135) * 192 * 10; 
    } 
+0

C'est une méthode dans une structure, voir le bas du code ajouté par l'OP. – marcc

+0

Sérieusement, je ne sais pas comment je pourrais rater quelque chose comme ça. J'ai honte de moi, merci beaucoup! –

+0

Cependant, qu'en est-il de la question de la distribution? –

2

Notez que vous ne devez pas utiliser « Dim » sur les variables de niveau classe/structure. Toujours utiliser Public, Protégé, Privé etc.

Notez également que la division fonctionne différemment dans VB et C#. En VB, si vous divisez deux entiers comme ceci:

Dim r As Double = 5/2 

Alors r sera une double valeur avec 2,5

en C# Cependant, la division avec des nombres entiers vous donne des résultats entiers, 2 dans ce cas.

+0

Gardez à l'esprit que VB a 2 opérateurs de division./est une division à virgule flottante et \ est une division entière. –

2

Si vous définissez Option Strict On dans votre code VB (que vous devriez vraiment toujours faire) alors je pense que vous auriez besoin de jeter les valeurs de retour en VB ainsi: les rendements Math.Floor() un Double, pas un Single, et vous devriez vraiment dire au compilateur que vous vouliez perdre cette précision (ce que fait le float) dans la version C# plutôt que de laisser le compilateur jeter la précision sans que vous preniez une décision éclairée .

Questions connexes