Вопрос

В настоящее время я пытаюсь перенести некоторый код 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 #), а не позволять компилятору отбросить точность без принятия обоснованного решения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top