<T>或对象上的扩展方法有什么实际区别吗?

sco*_*obi 5 c#

这两种扩展方法之间有什么实际区别吗?

class Extensions
{
    public static void Foo<T>(this T obj) where T : class { ... }
    public static void Foo(this object obj) { ... }
}
Run Code Online (Sandbox Code Playgroud)

我在扩展溢出中徘徊,我遇到了第一个表单,我以前没用过.好奇有什么区别.

SLa*_*aks 10

扩展方法Object也适用于值类型.(他们将被电话盒装,降低性能)

<T>但是没有的扩展方法where T : class也适用于值类型,但不会对它们进行封装.

另外,<T>可以编写扩展方法typeof(T)来获取其调用的编译时类型.
如果你这样做,请注意它们之间的区别

someButton.Extension();
someButton.Extension<Control>();
someButton.Extension<Object>();
Run Code Online (Sandbox Code Playgroud)