2011-05-09 263 views
3

我需要幫助,將一些代碼從VB轉換爲C#。將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是雙,Math.DivRem()在這種情況下應該返回長和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; 
    } 
+0

代碼是從http://www.codeproject.com/KB/security/cdkeys.aspx – 2011-05-09 15:03:28

回答

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

謝謝,現在它不會給我一個錯誤。 – 2011-05-09 15:25:40

0
IBase36 = (long)IBase36/36; 

是你想要的。 Math.DivRem()還有以上整數部分應該照顧的商。第三個輸出參數返回餘數,但因爲你不關心它在VB中。網絡代碼,你可以忽略它。

1

立即嘗試:

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

的第三個參數'Math.DivRem'是'out'所以'null'將不起作用 – JaredPar 2011-05-09 15:21:05

+0

感謝您指出它。我更新了答案。 – 2011-05-09 15:33:00