Проблема при портировании кода VB.NET на C#
Вопрос
В настоящее время я пытаюсь перенести некоторый код VB.NET на C#.
Структура в 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
С# Версия структуры:
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;
}
}
Почему мне нужно приводить возвращаемые значения к float & int?В версии vb мне это не нужно..
Всем спасибо.
Решение
Поставьте ()
после getXSectorOffset
потому что это функция?
пример:
nullPointX = pictureBox1.Width / 2 - sectorsize - centerPos.getSectorXOffset() / 10 * sectorsize / 192;
Что касается второго вопроса, вы можете избежать приведения к плавающему состоянию с помощью этой модификации:
public float getSectorY()
{
return (float)Math.Floor(y / 192f + 92f);
}
Извините, вам придется выполнить приведение к int
все еще.Если вы не примените x
и getXOffset()
к int
во время функции:
public Int32 getSectorXOffset()
{
return (((int)x / 192) - (int)getSectorX() + 135) * 192 * 10;
}
Другие советы
Обратите внимание, что вы не должны использовать " Dim " на переменные уровня класса / структуры. Всегда используйте Public, Protected, Private и т. Д.
Также обратите внимание, что деление работает по-разному в VB и C #. В VB, если вы разделите два целых числа следующим образом:
Dim r As Double = 5/2
Тогда r будет Double со значением 2,5
Однако в C # деление на целые числа дает целочисленные результаты, в данном случае 2.
Если вы установите Option Strict On в своем коде VB (что вы действительно должны всегда делать), то я думаю, что вам нужно будет приводить возвращаемые значения в VB также: Math.Floor () возвращает Double, а не Single, и вы должны действительно сказать компилятору, что вы хотите потерять эту точность (что и делает (float) приведение в версии C #), а не позволять компилятору отбросить точность без принятия обоснованного решения.