扩展方法中的"where T : class" VS 常规类



我想在以下两个扩展方法声明之间进行技术差异,以及何时使用其中一个声明:

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 有点难以阅读(

最新更新