例如我今天是第一次看到以下代码。
public abstract class SimpleFilter<T>
{
//blah
}
public abstract class SimpleFilter<TA, TB> : SimpleFilter<SimpleFilter<TA,TB>.Pair> {
//blah
public struct Pair
{
// blah
}
}
那么这些类具有相同的名称,但是数量/类型的泛型参数却不同?
有什么作用?
答案 0 :(得分:6)
两个仅在通用类(类型参数数量)不同的类名称之间需要具有 no 关系。没有什么特别的暗示或执行,因为它们恰好共享相同的名称(忽略类型参数)。
在IL中,它们以类似SimpleFilter`1
和SimpleFilter`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>
是不同的类,就像String
和Stream
是不同的类一样。显然,我们人类可能不会以同样的方式思考。