我想在以下两个扩展方法声明之间进行技术差异,以及何时使用其中一个声明:
public static void DoSomething(this MyClass theObject)
与
public static void DoSomething<T>(this T theObject) where T : MyClass
例如,我知道将其与从该类继承的类的对象一起使用时是有区别MyClass
但我不知道为什么。
假设此实现:
public static List<T> DoSomething<T>(this T theObject) where T : MyClass
=> new List<T>();
调用为
MyChildClass x; // MyChildClass : MyClass
var list = DoSomething(x);
// list is an instance of List<MyChildClass>, instead of List<MyClass>
当您不需要知道"实际"时,首先使用(非通用( (子(类型。
当您计划在 中使用"实际"类型时,请使用第二个(通用( 进一步的通用代码。
当有人将类/函数设计为泛型时,我认为这是一种"气味",即使它"不需要"泛型 = 基本类型就足够了。(等效的"通用"impl 有点难以阅读(