StringBuilder Append и AppendLine дают разные результаты для перечисления
При использовании строкового конструктора я получаю ожидаемые результаты от функций append и append line, когда использование перечисления является входным, но когда перечисление заключено в коробку, функция append line и 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
1 ответ:
Эта строка
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. C# не будет неявно преобразовывать
x
вint
при выборе, какую перегрузкуStringBuilder.Append
вызывать; он будет вызыватьStringBuilder.Append(object)
.