GetType().ToString()返回意外字符
本文关键字:字符 意外 ToString GetType 返回 | 更新日期: 2023-09-27 18:30:12
我对.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) 是否有某种方法可以预测这些(或其他)字符何时会包含在输出中?我可以看到,当使用构造类型时,它们是存在的,而当使用内在类型时则不是这样。
顺便说一句,这是我向斯塔克弗洛提出的第一个问题。在过去的几年里,我在这里发现了大量有价值的信息。这是我第一次找不到答案。
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
部分表示泛型类型参数的个数(在您的情况下始终为1),[System.String]
或[System.Int32]
部分表示用于该类型参数的类型参数。
例如,如果你创建了一个Dictionary<int, string>
,你会得到:
System.Collections.Generic.Dictionary`2[System.Int32,System.String]
`1
是一些泛型类型参数。
System.Collections.Generic.Queue`1[System.Int32]
表示具有1
类型参数的Queue
,该参数为Int32
这是CLR对泛型类型的表示法`1
表示该类型具有一个泛型参数。
这是必要的,因为泛型类型可以重载–有8种类型的名称为CCD_ 14。
CLR有时会在后台使用特殊/保留字符,以确保您不能创建与自动生成的类/声明同名的类/宣言。
您在这里看到的是生成的泛型类型的真实,在幕后
有人能解释一下这里发生了什么吗?
`1[System.String]
表示该类型具有一个类型参数,在这种情况下为System.String
。