在创建通用扩展方法时我们会扩展什么?

P.B*_*key 9 c#

public static class MyClass
{
    public static void Print<T>(this T theObject)
    {
        Console.WriteLine("The print output is " + theObject.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

在给定的类中,我已经指定了泛型作为要通过this关键字扩展的类型.因为我已经延迟了类型的定义,直到编译时,intellisense(以及其他任何涉及的)如何知道我正在扩展的类型?C#只是默认为顶级System.Object吗?

jas*_*son 1

由于我已将类型的定义推迟到编译时,智能感知(以及其他涉及的任何内容)如何知道我正在扩展什么类型?C# 是否只是默认为顶级 System.Object?

那些说这是对的扩展的人System.Object是错误的。其一,此方法不会对值类型输入进行装箱,而是System.Object会定义一个扩展方法。

您定义的扩展方法是一般参数化扩展方法。它可以应用于作为泛型类型参数有效的任何类型。

如果您还没有按照以下方式考虑扩展方法,这可能会帮助您更好地理解它们。扩展方法只是语言规范让我们逃脱的一个技巧。扩展方法实际上只是静态类中的静态方法,我们可以像调用实例方法一样调用它们。所以

static class Foo {
    public static void M(this object obj) { }
}
Run Code Online (Sandbox Code Playgroud)

只是静态类中的静态方法。你可以这样称呼它:

Foo.M(obj);
Run Code Online (Sandbox Code Playgroud)

但我们可以像调用实例方法一样调用它:

obj.M();
Run Code Online (Sandbox Code Playgroud)

因此,当您有一个通用扩展方法时,请停下来将其视为静态类中的静态方法

static class Foo {
    public static void M<T>(this T obj) { }
}
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼它:

object obj;
Foo.M(obj);
Run Code Online (Sandbox Code Playgroud)

或者你可以这样称呼它:

obj.M();
Run Code Online (Sandbox Code Playgroud)

你编写的编译器没有区别。

所以,现在您将其视为常规的泛型方法。但是,当您从这个角度考虑时,您肯定会明白编译器将允许您在作为泛型类型参数有效的任何类型上调用此方法。因此,您现在了解了为什么它可以被视为任何可作为泛型类型参数有效的类型的扩展方法。