Obecné metody (průvodce programováním v C#)

Obecná metoda je metoda, která je deklarována s parametry typu, následujícím způsobem:

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

Následující příklad kódu ukazuje jeden způsob volání metody pomocí int pro typ argument:

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

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

Můžete také vynechat argument typu a kompilátor ho odvodí. Následující volání Swap je ekvivalentní předchozímu volání:

Swap(ref a, ref b);

Stejná pravidla pro odvozování typů platí pro statické metody a metody instancí. Kompilátor může odvodit parametry typu na základě argumentů metody, které předáte; nemůže odvodit parametry typu pouze z omezení nebo návratové hodnoty. Odvození typu proto nefunguje s metodami, které nemají žádné parametry. Odvození typu probíhá v době kompilace předtím, než se kompilátor pokusí přeložit přetížené podpisy metody. Kompilátor použije logiku odvozování typu pro všechny obecné metody, které sdílejí stejný název. V kroku řešení přetížení kompilátor obsahuje pouze ty obecné metody, u kterých bylo odvození typu úspěšné.

V rámci obecné třídy mohou jiné než obecné metody přistupovat k parametrům typu na úrovni třídy následujícím způsobem:

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

Pokud definujete obecnou metodu, která přebírá stejné parametry typu jako obsahující třída, kompilátor generuje upozornění CS0693 , protože v rámci oboru metody, argument zadaný pro vnitřní T skryje argument zadaný pro vnější T. Pokud požadujete flexibilitu volání obecné metody třídy s jinými argumenty typu než ty, které byly zadány při vytvoření instance třídy, zvažte poskytnutí dalšího identifikátoru parametru typu metody, jak je znázorněno v GenericList2<T> následujícím příkladu.

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

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

Omezení použijte k povolení specializovaných operací s parametry typu v metodách. Tato verze Swap<T>, nyní pojmenovaný SwapIfGreater<T>, lze použít pouze s argumenty typu, které implementují IComparable<T>.

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;
    }
}

Obecné metody lze přetížit u několika parametrů typu. Například následující metody mohou být umístěny ve stejné třídě:

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

Parametr typu můžete použít také jako návratový typ metody. Následující příklad kódu ukazuje metodu, která vrací pole typu T:

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

Specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#.

Viz také