2011-02-02 73 views
2

當使用字符串生成器時,當使用enum是輸入時,我從append和append行函數中得到預期的結果,但是當enum被裝箱時,append行和append函數給出不同的結果。StringBuilder Append和AppendLine爲Enum提供了不同的結果

有誰能告訴我這可能是什麼?

代碼輸出:

Append Enum: 1 
Append Enum To String: One 
Append Line Enum: 1 
Append Line Enum To String: One 
Append Object: One 
Append Object To String: One 
Append Line Object: 1 
Append Line Object To String: One 

代碼:

Public Enum eTest 
    One = 1 
    Two = 2 
End Enum 

Sub Main() 
    Dim sb As New System.Text.StringBuilder() 
    Dim x = eTest.One 
    sb.Append("Append Enum: ").Append(x).AppendLine() 
    sb.Append("Append Enum To String: ").Append(x.ToString()).AppendLine() 
    sb.Append("Append Line Enum: ").AppendLine(x) 
    sb.Append("Append Line Enum To String: ").AppendLine(x.ToString()) 

    Dim o As Object = x 
    sb.Append("Append Object: ").Append(o).AppendLine() 
    sb.Append("Append Object To String: ").Append(o.ToString()).AppendLine() 
    sb.Append("Append Line Object: ").AppendLine(o) 
    sb.Append("Append Line Object To String: ").AppendLine(o.ToString()) 

    Console.WriteLine(sb.ToString()) 


    '=============================== 
    Console.ReadKey() 
End Sub 
+0

將選項Strict On放在文件的頂部以消除差異。 – 2011-02-02 20:36:35

回答

6

此行

sb.Append("Append Object: ").Append(o).AppendLine() 

導致o.ToString()要附加到的StringBuilder實例,這就是差。當然,這個調用只是傳遞給你的枚舉的盒裝實例,這就是爲什麼你看到One這個調用。

這是因爲您正在調用過載StringBuilder.Append(object),它將在傳入的對象實例中調用o.ToString()。這是明確的文件中:

Append方法調用Object.ToString方法得到的value字符串表示。如果valuenull,則不會更改StringBuilder對象。

在另一方面,當你調用

sb.Append("Append Enum: ").Append(x).AppendLine() 

其中x是一個枚舉的實例,x將被隱式轉換爲int一個實例,它將調用過載StringBuilder.Append(int)

請注意,這是特定於VB.NET。在選擇調用StringBuilder.Append的哪個超載時,C#不會將x隱式轉換爲int;它會調用StringBuilder.Append(object)

+0

這部分我認爲我很好,對我而言,好奇的是.Append(o)和.AppendLine(o)的輸出差異,分別發出「One」和「1」。我期望調用這兩個函數與盒裝對象給出相同的結果。 – 2011-02-04 15:34:23

相關問題