5

我对 .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的第一个问题。在过去的几年里,我在这里找到了大量有价值的信息。这是我第一次找不到答案。

4

6 回答 6

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

于 2013-09-03T16:29:48.493 回答
4

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

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

System.Collections.Generic.Dictionary`2[System.Int32,System.String]
于 2013-09-03T16:29:21.730 回答
1

`1是一些泛型类型参数。

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

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

于 2013-09-03T16:29:28.827 回答
1

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

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

于 2013-09-03T16:29:31.720 回答
0

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

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

于 2013-09-03T16:30:49.863 回答
0

有人可以解释这里发生了什么吗?

`1[System.String]意味着该类型有一个类型参数,System.String在这种情况下。

于 2013-09-03T16:36:34.270 回答