2011-02-02 75 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

相关问题