当C#重载基于泛型的类名时,它叫什么?

时间:2018-08-24 08:57:13

标签: c# generics

例如我今天是第一次看到以下代码。

public abstract class SimpleFilter<T>
{
    //blah
}

public abstract class SimpleFilter<TA, TB> : SimpleFilter<SimpleFilter<TA,TB>.Pair> {

    //blah
    public struct Pair
    {
     // blah
    }
}

那么这些类具有相同的名称,但是数量/类型的泛型参数却不同?

有什么作用?

2 个答案:

答案 0 :(得分:6)

两个仅在通用类(类型参数数量)不同的类名称之间需要具有 no 关系。没有什么特别的暗示或执行,因为它们恰好共享相同的名称(忽略类型参数)。

在IL中,它们以类似SimpleFilter`1SimpleFilter`2的名称结尾-名称不同,并且名称末尾的数字只是名称的一部分(但碰巧表明有多少类型他们拥有的参数)

但是,在这种情况下,我们有两个具有继承关系的类。泛型没有什么特别值得注意的。

答案 1 :(得分:3)

签名不同但名称相同的方法称为重载。我们总称“方法的重载”是因为大多数时候方法都做同样的事情。 String.Split(char[])String.Split(char[], StringSplitOptions)本质上是在做相同的事情-拆分字符串。

但是,具有不同数量的泛型类型参数的类型并非如此。它们代表了完全不同的事物。 Tuple<T1, T2>代表具有2个值的元组。 Tuple<T1,T2,T3,T4,T5>代表具有5个值的元组。这些是完全不同的东西。我们没有一个特殊的名字。我们只称其为Tuple<T1, T2>Tuple<T1,T2,T3,T4,T5>。它们之间并没有真正的联系,因为它们代表了截然不同的事物。

就我个人而言,我从未尝试过共同引用所有具有相同名称的不同类。我猜您可以将其称为“ Tuple类”,或者在这种情况下称为“ SimpleFilter类”。

这不是语言功能。具有相同名称但类型参数不同的类就是不同的类。就编译器而言,Tuple<T1, T2>Tuple<T1, T2, T3>是不同的类,就像StringStream是不同的类一样。显然,我们人类可能不会以同样的方式思考。