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