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

顺便说一句,这是我向斯塔克弗洛提出的第一个问题。在过去的几年里,我在这里发现了大量有价值的信息。这是我第一次找不到答案。

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

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