当使用字符串构建器时,当使用枚举作为输入时,我从append和append行函数得到预期结果,但是当枚举被加框时,追加行和追加函数会给出不同的结果。
谁能告诉我这可能背后的原因?
代码输出:
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 :(得分:6)
这一行
sb.Append("Append Object: ").Append(o).AppendLine()
导致o.ToString()
附加到StringBuilder
的实例,这就是差异。当然,该调用只是传递给枚举的盒装实例,这就是为什么你看到这个调用的One
。
这是因为你正在调用重载StringBuilder.Append(object)
,它只会在传入的对象实例中调用o.ToString()
。这在文档中明确说明:
Append
方法调用Object.ToString
方法来获取value
的字符串表示形式。如果value
为null
,则不会对StringBuilder
对象进行任何更改。
另一方面,当你打电话
sb.Append("Append Enum: ").Append(x).AppendLine()
其中x
是枚举的实例,x
将隐式转换为int
的实例,该实例将调用重载StringBuilder.Append(int)
。
请注意,这是特定于VB.NET的。在选择调用x
的重载时,C#不会隐式地将int
转换为StringBuilder.Append
;它会调用StringBuilder.Append(object)
。