【问题标题】:GetType().ToString() Returns Unexpected CharactersGetType().ToString() 返回意外字符
【发布时间】:2013-09-06 23:25:24
【问题描述】:

我是 .Net 的新手,正在研究基础对象数组如何处理不同的类型。我倾向于在开关中使用 GetType().ToString() 组合来集中代码中的事件处理,我遇到了以下返回值。我在这里和其他地方(包括 C# 规范)寻找答案,但找不到直接解决的地方:

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Objectify
{
    class Program
    {
        static void Main(string[] args)
        {
            object[] arrObjects = {"", 0, 0.0M, 'a', new Stack<string>(), new Queue<string>(), new Stack<int>(), new Queue<int>()};

            for (int i = 0; i < arrObjects.Length; i++ )
            {
                Console.WriteLine(arrObjects[i].GetType().ToString());
            }           
        }
    }
}

输出:

System.String
System.Int32
System.Decimal
System.Char
System.Collections.Generic.Stack`1[System.String]
System.Collections.Generic.Queue`1[System.String]
System.Collections.Generic.Stack`1[System.Int32]
System.Collections.Generic.Queue`1[System.Int32]

从我的角度来看,第 5 - 8 行的“`1”部分是出乎意料的。

a) 有人可以解释这里发生了什么吗? b) 有没有办法预测这些(或其他)字符何时会包含在输出中?我可以看到它们在使用构造类型时存在,而在使用内在类型时则不存在。

顺便说一句,这是我对 stackoverflow 的第一个问题。在过去的几年里,我在这里找到了大量有价值的信息。这是我第一次找不到答案。

【问题讨论】:

  • 也可以试试typeof(IComparable).ToString()typeof(IComparable&lt;&gt;).ToString()typeof(IDictionary&lt;,&gt;).ToString()typeof(Func&lt;,,,,&gt;).ToString()等。对于嵌套类型,您会得到一个+,例如typeof(Environment.SpecialFolder).ToString()typeof(Dictionary&lt;,&gt;.KeyCollection).ToString()

标签: c# tostring gettype


【解决方案1】:

Type.ToString 方法使用`1 作为泛型类型的标记(1 指的是“一个”泛型参数)。这个:

 System.Collections.Generic.Stack`1[System.String] 

的实际类型名称
 System.Collections.Generic.Stack<System.String>

在 C# 语法中。请注意,每种语言都可以有自己的语法。例如,同样的类型,在 VB 中是:

 System.Collections.Generic.Stack(Of System.String)

主要区别在于Type.ToString 是 CLR 的一部分,并且不依赖于特定语言(如 C#),因此用于显示泛型类型的语法不同。

【讨论】:

    【解决方案2】:

    当然 - 类型是通用的。 `1 部分表示泛型类型参数的数量(在您的情况下始终为 1),[System.String][System.Int32] 部分表示用于的类型 参数那个类型参数。

    例如,如果你创建了一个Dictionary&lt;int, string&gt;,你会得到:

    System.Collections.Generic.Dictionary`2[System.Int32,System.String]
    

    【讨论】:

      【解决方案3】:

      `1 是多个泛型类型参数。

      System.Collections.Generic.Queue`1[System.Int32]
      

      表示带有1 类型参数的Queue,即Int32

      【讨论】:

        【解决方案4】:

        这是 CLR 对泛型类型的表示法。
        `1 表示该类型有一个泛型参数。

        这是必要的,因为泛型类型可以被重载——有 8 种类型的名称为 System.Action

        【讨论】:

          【解决方案5】:

          CLR 有时会在幕后使用特殊/保留字符,以确保您无法创建与自动生成的名称相同的类/声明。

          您在这里看到的是生成的泛型类型真正在幕后的样子

          【讨论】:

            【解决方案6】:

            有人能解释一下这里发生了什么吗?

            `1[System.String] 表示该类型有一个类型参数,在本例中为System.String

            【讨论】:

            • 对于嵌套在泛型类型中的类型,拆分可能会失败。例如var dict = new Dictionary&lt;string, object&gt;(); var typeStr = dict.Keys.GetType().ToString();,字符串将是System.Collections.Generic.Dictionary`2+KeyCollection[System.String,System.Object],然后在反引号上拆分就太天真了。
            • @Jeppe:我明白了。我删除了反引号上关于拆分的部分。
            猜你喜欢
            • 2012-09-10
            • 1970-01-01
            • 2012-11-08
            • 1970-01-01
            • 1970-01-01
            • 2017-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多