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

时间:2018-07-04 11:45:56

标签: c# generics

我希望在以下两个扩展方法声明之间以及您何时在另一个之上使用技术上的区别:

public static void DoSomething(this MyClass theObject)

vs

public static void DoSomething<T>(this T theObject) where T : MyClass

例如,我知道将其与从MyClass类继承的类的对象一起使用时会有所不同,但我不知道为什么。

1 个答案:

答案 0 :(得分:1)

假设此实现:

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>
  • 当您不需要了解“实际”时,请首先使用(非通用) (儿童)类型。

  • 当您计划在其中使用“实际”类型时,请使用第二个(泛型) 进一步的通用代码。

当某人将一个类/函数设计为泛型时,我将其视为“气味”,即使它“不必是”泛型=基本类型也已足够。 (等效的“通用”隐喻有点难以理解)