将VB代码转换为C# - 类型转换

3

我需要帮助将一些VB代码翻译成C#。

Public Function ToBase36(ByVal IBase36 As Double) As String
    Dim Base36() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
    Dim v As String
    Dim i As Decimal
    Do Until IBase36 < 1
        i = IBase36 Mod 36
        v = Base36(i) & v
        IBase36 = Math.DivRem(Long.Parse(IBase36), 36, Nothing)
    Loop
    Return v

End Function

我的问题是VB中的类型转换如何工作,而这行代码给了我最大的麻烦,因为IBase36是一个double类型,在这种情况下,Math.DivRem()应该返回long类型,而Long.Parse()需要一个字符串。

IBase36 = Math.DivRem(Long.Parse(IBase36), 36, Nothing)

感谢JaredPar和其他人的帮助,这是我的翻译并且运行正常的代码。

    public static string ToBase36(double IBase36)
    {
        string[] Base36 = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
        string v = null;
        long i = default(long);
        while (!(IBase36 < 1))
        {
            IBase36 = Convert.ToDouble(Math.DivRem(Convert.ToInt64(IBase36), 36, out i));
            v = Base36[i] + v;
        }
        return v;
    }

代码来自http://www.codeproject.com/KB/security/cdkeys.aspx。 - Velja Matic
3个回答

2
为了翻译这个内容,首先需要理解VB.Net代码如何运作。在底层,它实际上会生成以下内容。
Dim unused As Long
IBase36 = CDbl(Math.DivRem(Long.Parse(CStr(IBase36)), 36, unused)

注意:未使用的变量是必需的,因为第三个参数是一个“out”。这在翻译成C#时是一个重要的区别。
上述内容在C#中最自然的等价物是:
long unused;
IBase36 = Convert.ToDouble(Math.DivRem(Long.Parse(IBase36.ToString()), 36, out unused);

1

现在试试:

long unused = null;
IBase36 = Convert.ToDouble(Math.DivRem(Convert.ToInt64(IBase36), 36, out unused));

Math.DivRem 的第三个参数是 out,因此 null 无法使用。 - JaredPar

0
IBase36  = (long)IBase36 / 36;

这就是你想要的。Math.DivRem() 返回上述整数除法应该处理的商。第三个输出参数返回余数,但由于在vb.net代码中你不关心它,所以可以忽略它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接