-2

オブジェクトが null かどうかを判断する拡張メソッドを定義できます

public static bool IsNull(this object obj) {
    if (obj == null)
        return true;
    else return false;
}

しかし、私はこれを行うこともできます:

public static bool IsNull<T>(this T obj) {
    if(obj == null)
        return true;
    else return false;
}

両方がすべてのオブジェクトに適用されています。このTの目的は何ですか?さらに詳しく説明すると、どのタイプが期待されていますか? はいの場合、なぜこれtypeof(T)が可能ですか?そして、背後にある理由は何ですか(this T obj) where T: int)どこで)?@MatthewWatson が指摘したように、これはとにかく機能しません

非常に多くの質問。

4

3 に答える 3

5

Tジェネリック メソッドの型引数です。

ジェネリックに関する MSDN ドキュメントについては、http: //msdn.microsoft.com/en-us/library/512aeb7t.aspxを参照してください。

特に拡張メソッドとは関係ありません。それは単にジェネリックと関係があります。

于 2013-06-19T13:02:02.943 に答える
3

T はジェネリックを意味します。タイプがわからないということです。.Net ではすべてがオブジェクトであるため、デフォルトではオブジェクトです。ただし、T を where パラダイムで特殊化できます。たとえば、T は IDisposable です。次に、関数は IDisposable 型にのみ適用されます。

于 2013-06-19T13:02:07.510 に答える
1

T歴史的には を意味しTypeます。これは、一般的な (C++ - テンプレートの) パラメータを定義するために慣例で使用されます。あなたの例では、.NETインフラストラクチャのオブジェクトは base を継承するため、必要ありませんobject

しかし、C# さえ導入されていなかった C++ の古き良き時代を思い出してください。C++ には、共通の親を持たない単純な型 (つまりobject) しかありません。そのため、開発者はコンパイラに「ここで何かが置き換えられます。実際には正確にはわかりませんが、後でコンパイル時に明らかになります。私のためにやってください」と伝えるために何かを使用することを余儀なくされました。

表記に戻ると、MFC では別のプレフィックスが使用されていました - Clike CString.

UPD:最初の例は機能しません。これは拡張機能であり、nullオブジェクトにはメソッドがないためですIsNull

UPD1:上記の UPD を読まないでください。ケーキは嘘です。

于 2013-06-19T13:08:10.013 に答える