Проблема при портировании кода VB.NET на C # - PullRequest
0 голосов
/ 10 сентября 2009

В настоящее время я пытаюсь перенести некоторый код 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

C # Версия структуры:

    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 мне не нужно ..

Спасибо всем.

Ответы [ 3 ]

2 голосов
/ 10 сентября 2009

Обратите внимание, что вы не должны использовать "Dim" для переменных уровня класса / структуры. Всегда используйте Public, Protected, Private и т. Д.

Также обратите внимание, что деление работает по-разному в VB и C #. В VB, если вы разделите два целых числа следующим образом:

Dim r As Double = 5/2

Тогда r будет Double со значением 2,5

Однако в C # деление на целые числа дает целочисленные результаты, в данном случае 2

2 голосов
/ 10 сентября 2009

Если вы установите Option Strict On в своем коде VB (что вы действительно должны всегда делать), то я думаю, что вам также необходимо преобразовать возвращаемые значения в VB : Math.Floor () возвращает Double, а не Single, и вы должны действительно сказать компилятору, что вы хотите потерять эту точность (что и делает (float) приведение в версии C #) вместо того, чтобы позволить компилятору генерировать точность прочь без принятия обоснованного решения.

2 голосов
/ 10 сентября 2009

Поставьте () после 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...