Перевод VB в C # — преобразование типов

#c# #vb.net #implicit-conversion

#c# #vb.net #неявное преобразование

Вопрос:

Мне нужна помощь с переводом некоторого кода с 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) amp; v
        IBase36 = Math.DivRem(Long.Parse(IBase36), 36, Nothing)
    Loop
    Return v

End Function
  

Моя проблема в том, как работает преобразование типов в VB, и эта строка доставляет мне больше всего проблем, поскольку IBase36 является двойным, 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;
    }
  

Комментарии:

1. код взят из codeproject.com/KB/security/cdkeys.aspx

Ответ №1:

Для перевода важно сначала понять, как работает VB.Функции сетевого кода. По сути, это приведет к следующему

 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);
  

Ответ №2:

Теперь попробуйте:

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

Комментарии:

1. Третий аргумент для Math.DivRem является out so null , который не будет работать

Ответ №3:

 IBase36  = (long)IBase36 / 36;
  

это то, что вы хотите. Math.DivRem() возвращает частное, о котором должно позаботиться указанное выше целочисленное деление. Третий параметр out возвращает остаток, но поскольку в коде vb. net это вас не волнует, вы можете просто проигнорировать это.