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

时间:2012-04-04 15:31:43

标签: c#

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

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

2 个答案:

答案 0 :(得分:3)

是的,除非您添加类型约束,否则它为System.Object

答案 1 :(得分:1)

  

由于我已经延迟了类型的定义直到编译时,intellisense(以及其他任何涉及的内容)如何知道我正在扩展的类型? C#是否默认为顶级System.Object?

那些说这是System.Object的扩展名的人是错误的。例如,此方法不会对值值类型输入进行设置,但System.Object上定义的扩展方法将为。

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

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

static class Foo {
    public static void M(this object obj) { }
}

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

Foo.M(obj);

但我们可以称之为实例方法:

obj.M();

因此,当你有一个通用的扩展方法时,停一分钟并将其视为静态类中的静态方法

static class Foo {
    public static void M<T>(this T obj) { }
}

您可以这样称呼它:

object obj;
Foo.M(obj);

或者您可以这样称呼它:

obj.M();

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

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