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は間違っています。1 つには、このメソッドは値の型の入力をボックス化するのではなく、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 に答える