2013-07-21 61 views
0

我發現了將C#代碼片段轉換爲VB.NET的奇怪情況,代碼是一個從基本10轉換爲基本36的小類,反之亦然。C#中的剩餘運算符與Visual Basic中的MOD執行不同

關鍵的一點是這樣的功能:

/// <summary> 
    /// A Base36 De- and Encoder 
    /// </summary> 
    public static class Base36 
    { 
     private const string CharList = "abcdefghijklmnopqrstuvwxyz"; 

     /// <summary> 
     /// Encode the given number into a Base36 string 
     /// </summary> 
     /// <param name="input"></param> 
     /// <returns></returns> 
     public static String Encode(long input) 
     { 
      if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative"); 

      char[] clistarr = CharList.ToCharArray(); 
      var result = new Stack<char>(); 
      while (input != 0) 
      { 
       result.Push(clistarr[input % 36]); 
       input /= 36; 
      } 
      return new string(result.ToArray()); 
     } 

在VB.NET轉換應導致:

Public NotInheritable Class Base36 
    Private Sub New() 
    End Sub 
    Private Const CharList As String = "abcdefghijklmnopqrstuvwxyz" 

    ''' <summary> 
    ''' Encode the given number into a Base36 string 
    ''' </summary> 
    ''' <param name="input"></param> 
    ''' <returns></returns> 
    Public Shared Function Encode(input As Int64) As String 
     If input < 0 Then 
      Throw New ArgumentOutOfRangeException("input", input, "input cannot be negative") 
     End If 

     Dim clistarr As Char() = CharList.ToCharArray() 
     Dim result = New Stack(Of Char)() 
     While input <> 0 
      result.Push(clistarr(input Mod 36)) 
      input /= 36 
     End While 
     Return New String(result.ToArray()) 
    End Function 

的問題是,在VB.NET模運算符執行不同的是實際上,如果你在C#中調用編碼方法:

 long l = 13072113072399; 
     string result = Base36.Encode(l); //Result is : 4mt8um0b3 

同時呼籲在C#中的方法:

Dim l As Int64 = 13072113072399 
    Dim result As String = Base36.Encode(l) //Result is : 5nujsu3ar 

該負責的差異是不同的結果,在某些情況下,模運算回報,爲什麼呢?

VB.NET中%餘數運算符的等效值是多少?

+3

如果您認爲運營商是給你不同的結果,然後寫了一個演示此小自足的例子。 **如何**完全不同的結果?我們不需要關心所有Base36問題。 –

+1

VB.net是否使用基於1的數組或類似的東西? –

+0

@JonathonReinhart:Ew編號:D – Ryan

回答

4

Mod操作:在兩個int小號使用時

clistarr(input Mod 36) 

但實際的問題是

input /= 36 

在C#中,/是整數除法。在VB.NET中,/DoubleInteger s,它使用銀行家四捨五入。將其更改爲整數除法:

input \= 36 

或者使用DivMod正確:

input = Math.DivRem(input, 36, remainder) 
+0

不起作用... – aleroot

+1

@aleroot:試試'input \ = 36'而不是'input/= 36'。或者就像你最初寫的那樣'輸入= Math.DivRem(輸入,36,餘數)',因爲這*是* DivRem'的用途。 – Ryan

+0

好的,它適用於:input \ = 36。謝謝。 – aleroot