.NET TypeSystem 是一个非常强大的系统。想象以下场景。我正在编写一个名为的类MyTuple
,它是 BCLTuple
类的编码不佳的克隆:
public class MyTuple<T1, T2> {
public T1 Item1 { get; private set; }
public T2 Item2 { get; private set; }
public MyTuple(T1 item1, T2 item2) {
this.Item1 = item1;
this.Item2 = item2;
}
}
然后我意识到我想为该类型创建一种工厂类型的方法,以便我可以成功地挂接到类型推断系统中而不是指定T1
,T2
当我不必这样时:
new MyTuple<int, string>(123, "test"); // which is also a bit redundant
所以我正在写我在课堂上谈论的方法,让我们称之为类Factory
:
public class Factory {
public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
return new MyTuple<T1, T2>(item1, item2);
}
}
这样,我在写作时会更快乐:
var tuple = Factory.Create(123, "test"); // and tuple is inferred to be of <int, string>
现在如果我重命名Factory
为会发生什么MyTuple
:
public class MyTuple {
public static MyTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
return new MyTuple<T1, T2>(item1, item2);
}
}
简而言之:没什么不好
很简单,我现在有 2 种完全不同的类型:
- MyTuple(非泛型)
- MyTuple < T1, T2 >
它们没有任何共同点,它们是不同的类型。
我可以说MyTuple<T1, T2>
只是碰巧延长了MyTuple
吗?好吧,只要MyTuple
既不是static
也不是sealed
,是的,当然!
public class MyTuple { ... }
public class MyTuple<T1, T2> : MyTuple { ... }
Mammal
因此,在您的情况下,扩展Animal
或...Tiger
扩展仅此而已Mammal
。这不像Mammal of a weirder sort
扩展Mammal of a good ol' classical sort
。