gpt4 book ai didi

c# - .NET:为什么嵌套类具有在外部类中声明的泛型?

转载 作者:太空宇宙 更新时间:2023-11-03 16:58:47 24 4
gpt4 key购买 nike

因为 Type.FullName 有点难看,我需要制作我漂亮的名字构造函数。但是当我使用 Type.GetGenericArguments() 时遇到了一个问题。

外部类 C1 的泛型 T 总是分发给嵌套类 C2C3

class C1<T> {
public class C2<T1, T2> {
}
public class C3 {
}
}

typeof( C1<> ).ToString(); // C1`1[T]
typeof( C1<>.C2<,> ).ToString(); // C1`1+C2`2[T,T1,T2]
typeof( C1<>.C3 ).ToString(); // C1`1+C3[T]

两个问题:

  • 如何判断泛型类型是否来自外部类?
  • 这种行为的原因是什么?

最佳答案

CIL 中的嵌套类不“继承”类型参数。在那里,你的类(class)看起来像这样:

.class private auto ansi beforefieldinit C1`1<T> extends [mscorlib]System.Object
{
.class nested public auto ansi beforefieldinit C2`2<T, T1, T2> extends [mscorlib]System.Object
{
}

.class nested public auto ansi beforefieldinit C3<T> extends [mscorlib]System.Object
{
}
}

由于嵌套类型的定义实际上并不依赖于父类型,它不需要访问外部泛型参数,因此决定它们必须显式重复,就像 C# 所做的那样,但是支持以不同方式工作的语言(其中 C1<>.C3 可以是具体类型)。

您的问题是从 .NET 类型获取 C# 类型表达式。你可能会很幸运 CodeDOM ,或者简单地假设如果嵌套类型的泛型参数与父类型的泛型参数同名,则可以在创建字符串时省略它们。

因此,重申一下,泛型参数不能来自 .NET 中的外部类,这只是 C# 的行为。如果您假设该类是用 C# 创建的,您可以简单地根据名称删除参数。

关于c# - .NET:为什么嵌套类具有在外部类中声明的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54829766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com