GetType()。ToString()返回意外字符

时间:2013-09-03 16:26:27

标签: c# tostring gettype

我是.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)是否有某种方法可以预测这些(或其他)字符何时会包含在输出中?我可以看到它们在使用构造类型时存在,而在使用内在类型时则不然。

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

6 个答案:

答案 0 :(得分:5)

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#),因此用于显示泛型类型的语法不同。

答案 1 :(得分:4)

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

例如,如果你创建了一个Dictionary<int, string>,你会得到:

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

答案 2 :(得分:1)

`1是一些通用类型参数。

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

表示Queue 1类型参数为Int32

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

  

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

`1[System.String]表示该类型有一个类型参数,在这种情况下为System.String