StringBuilder Append和AppendLine为Enum提供不同的结果

Jef*_*sor 2 .net stringbuilder append

当使用字符串构建器时,当使用枚举作为输入时,我从append和append行函数得到预期结果,但是当枚举被加框时,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
Run Code Online (Sandbox Code Playgroud)

码:

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
Run Code Online (Sandbox Code Playgroud)

jas*_*son 6

这条线

sb.Append("Append Object: ").Append(o).AppendLine()
Run Code Online (Sandbox Code Playgroud)

导致o.ToString()附加到实例,StringBuilder这是差异.当然,该调用只是传递给枚举的盒装实例,这就是为什么你看到One这个调用.

这是因为您正在调用StringBuilder.Append(object)o.ToString()在传入的对象实例中调用的重载.这在文档中明确说明:

Append方法调用该Object.ToString方法来获取字符串表示形式value.如果valuenull,则不对StringBuilder对象进行任何更改.

另一方面,当你打电话

sb.Append("Append Enum: ").Append(x).AppendLine()
Run Code Online (Sandbox Code Playgroud)

其中x是枚举的实例,x将隐式转换为int将调用重载的实例StringBuilder.Append(int).

请注意,这是VB.NET特有的.在选择要调用的重载时,C#不会隐式转换x为; 它会调用.intStringBuilder.AppendStringBuilder.Append(object)

  • 这是VB.NET.`StringBuilder.AppendLine`只有两个重载.第一个是`AppendLine()`,第二个是`AppendLine(string)`.第一个不适用于此.所以,它是第一个适用的.所以现在我们将一个声明为`object`的变量传递给一个接收`string`类型参数的方法.VB.NET将添加对`Microsoft.VisualBasic.CompilerServices.Conversions.ToString(object)`的调用,它将检测`o`是否可转换为`Int32`的实例,然后将调用`Int32.ToString`.添加`Option Strict On`,这不会发生.它也不会发生在C#中. (2认同)