Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将VB.NET代码移植到C时出现问题#_C#_Vb.net_Struct_Casting - Fatal编程技术网

C# 将VB.NET代码移植到C时出现问题#

C# 将VB.NET代码移植到C时出现问题#,c#,vb.net,struct,casting,C#,Vb.net,Struct,Casting,目前我正在尝试将一些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 / 19

目前我正在尝试将一些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版本中,我不必

谢谢大家。

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;
    }
()
放在
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”。始终使用公共、受保护、私人等

还要注意的是,在VB和C中除法的工作方式不同。在VB中,如果像这样将两个整数除以:

Dim r As Double = 5/2
那么r将是一个值为2.5的双精度数


然而,在C#中,整数除法给出整数结果,在这种情况下为2。

注意,不应在类/结构级变量上使用“Dim”。始终使用公共、受保护、私人等

还要注意的是,在VB和C中除法的工作方式不同。在VB中,如果像这样将两个整数除以:

Dim r As Double = 5/2
那么r将是一个值为2.5的双精度数


然而,在C#中,用整数除法会得到整数结果,在这种情况下为2。

如果在VB代码中设置选项Strict On(您确实应该经常这样做),那么我认为您也需要在VB中强制转换返回值:Math.Floor()返回双精度,而不是单精度,你应该告诉编译器你想失去精度(这是C版本中的(浮点)强制转换所做的),而不是让编译器在没有做出明智决定的情况下丢掉精度。

如果你在VB代码中设置选项Strict On(你真的应该一直这样做)然后,我认为您还需要在VB中强制转换返回值:Math.Floor()返回一个双精度值,而不是一个单精度值,您应该真正告诉编译器您想要失去该精度(这就是C#版本中的(float)强制转换所做的)不要让编译器在没有做出明智决定的情况下丢掉精度。

这是结构中的一个方法,请参阅OP添加的代码底部。说真的,我不知道我怎么会错过这样的东西。我为自己感到羞耻,非常感谢!但是,关于演员问题呢?修改了答案以包含第二个答案我认为真正的问题是在VB.Net中使用
选项Strict Off
,因此演员不必显式编写。当然,这是一个糟糕的做法,会导致错误。这是一个结构中的方法,请参见OP添加的代码底部。说真的,我不知道我怎么会错过这样的东西。我为自己感到羞耻,非常感谢!但是,关于演员问题呢?修改了答案以包含第二个答案我认为真正的问题是在VB.Net中使用
选项Strict Off
,因此演员不必显式编写。当然,这是一个糟糕的做法,并导致错误。请记住,VB有2个除法运算符是浮点除法,\是整数除法。请记住VB有两个除法运算符。/是浮点除法,\是整数除法。