#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
sonull
, который не будет работать
Ответ №3:
IBase36 = (long)IBase36 / 36;
это то, что вы хотите. Math.DivRem() возвращает частное, о котором должно позаботиться указанное выше целочисленное деление. Третий параметр out возвращает остаток, но поскольку в коде vb. net это вас не волнует, вы можете просто проигнорировать это.