StringBuilder Append и AppendLine дают разные результаты для Enum - PullRequest
2 голосов
/ 02 февраля 2011

При использовании строкового компоновщика я получаю ожидаемые результаты от функций добавления и добавления строки, когда использование перечисления является вводом, но когда перечисление заключено в коробку, строка добавления и функция добавления дают разные результаты.Может кто-нибудь сказать мне, что может быть за этим?

Вывод кода:

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 Ответ

6 голосов
/ 02 февраля 2011

Эта строка

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.СЕТЬ.C # не будет неявно преобразовывать x в int при выборе, какую перегрузку StringBuilder.Append вызывать;это вызовет StringBuilder.Append(object).

...