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 2

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).