Megosztás a következőn keresztül:


Általános módszerek (C# programozási útmutató)

Az általános metódus olyan metódus, amely típusparaméterekkel deklarálva van az alábbiak szerint:

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

Az alábbi példakód bemutatja, hogyan hívhatja meg a metódust a típusargumentum használatával int :

public static void TestSwap()
{
    int a = 1;
    int b = 2;

    Swap<int>(ref a, ref b);
    System.Console.WriteLine(a + " " + b);
}

Kihagyhatja a típusargumentumot is, és a fordító azt fogja következtetni. A következő hívás Swap egyenértékű az előző hívással:

Swap(ref a, ref b);

A típuskövetkező szabályok a statikus metódusokra és a példánymetelyekre is érvényesek. A fordító a megadott metódusargumentumok alapján következtethet a típusparaméterekre; a típusparamétereket nem tudja csak kényszerből vagy visszatérési értékből következtetni. Ezért a típuskövetkezés nem működik paraméterekkel nem rendelkező metódusokkal. A típuskövetkeztetés a fordítási időpontban történik, mielőtt a fordító megpróbálja feloldani a túlterhelt metódus-aláírásokat. A fordító típuskövetkeztetési logikát alkalmaz az azonos nevű általános metódusokra. A túlterhelésfeloldási lépésben a fordító csak azokat az általános metódusokat tartalmazza, amelyeken a típuskövetkeztetés sikeres volt.

Egy általános osztályon belül a nem általános metódusok az alábbi módon férhetnek hozzá az osztályszintű típusparaméterekhez:

class SampleClass<T>
{
    void Swap(ref T lhs, ref T rhs) { }
}

Ha olyan általános metódust határoz meg, amely ugyanazokat a típusparamétereket használja, mint a tartalmazó osztály, a fordító a CS0693 figyelmeztetést generál, mert a metódus hatókörében a belsőhöz T megadott argumentum elrejti a külsőhöz Tmegadott argumentumot. Ha olyan általános osztálymetódus meghívására van szükség, amely nem az osztály példányosításakor megadott típusargumentumokkal rendelkezik, fontolja meg a metódus típusparaméterének egy másik azonosítójának megadását az alábbi példában GenericList2<T> látható módon.

class GenericList<T>
{
    // CS0693.
    void SampleMethod<T>() { }
}

class GenericList2<T>
{
    // No warning.
    void SampleMethod<U>() { }
}

Korlátozásokkal speciálisabb műveleteket engedélyezhet a metódusok típusparamétereihez. Ez a Swap<T>most elnevezett SwapIfGreater<T>verzió csak a implementálandó IComparable<T>típusargumentumokkal használható.

void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
    T temp;
    if (lhs.CompareTo(rhs) > 0)
    {
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}

Az általános metódusok több típusparaméteren túlterhelhetők. A következő metódusok például ugyanabban az osztályban találhatók:

void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }

A típusparamétert a metódus visszatérési típusaként is használhatja. Az alábbi példakód egy metódust mutat be, amely egy típustömböt Tad vissza:

T[] Swap<T>(T a, T b)
{
    return [b, a];
}

C# nyelvi specifikáció

További információkért lásd a C# nyelvi specifikációját.

Lásd még