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

在给定的类中,我指定了一个泛型作为通过this关键字扩展的类型。由于我已经将类型的定义延迟到编译时,智能感知(以及其他相关的)如何知道我正在扩展什么类型?C# 是否只是默认为顶层System.Object

4

2 回答 2

3

是的,System.Object除非您添加类型约束。

于 2012-04-04T15:32:31.900 回答
1

由于我已经将类型的定义延迟到编译时,智能感知(以及其他相关的)如何知道我正在扩展什么类型?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();

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

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

于 2012-04-04T16:54:24.303 回答