Sdílet prostřednictvím


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

Obecná metoda je metoda, která je deklarována s parametry typu takto:

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 pomocí volání metody int argumentu typ:

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

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

Argument typu můžete vypustit a kompilátor odvodí.Následující volání na Swap je ekvivalentní předchozí volání:

Swap(ref a, ref b);

Statické metody a metody instance se použijí stejná pravidla pro odvození typu.Kompilátor lze odvodit parametry typu na základě argumenty metody, které předat nelze odvodit parametry typu pouze z omezení nebo vrátit hodnotu.Odvození typu proto nefunguje s metody, které nemají žádné parametry.Odvození typu dochází při kompilaci před kompilátor pokouší vyřešit Přetěžovaná metoda podpisy.Kompilátor logiky odvození typu platí pro všechny obecné metody, které sdílejí stejný název.V kroku řešení přetížení kompilátor obsahuje pouze obecné metody které proběhlo úspěšně odvození typu.

V rámci Obecná třída obecné metody přístup parametry úrovně třídy typu takto:

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

Pokud definujete obecná metoda, která má stejné parametry jako třída obsahující typ, kompilátor generuje varování CS0693, protože v rámci oboru metoda zadaný argument pro vnitřní T skryje argument pro vnější T.Pokud požadujete flexibilní volání metody Obecná třída s argumenty typu než ty, pokud byla vytvořena instance třídy, zvážit jiný identifikátor pro parametr typu metody, jak je uvedeno v GenericList2<T> v následujícím příkladu.

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

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

Pomocí omezení další specializované činnosti na parametry typu metody.Tato verze Swap<T>, nyní pojmenovaná SwapIfGreater<T>, lze použít pouze s argumenty typu, které implementují IComparable.

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 můžete přetížení na několik parametrů typu.Například následující metody mohou být nacházejí ve stejné třídy:

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

Specifikace jazyka C#

Další informace naleznete Specifikace jazyka C#.

Viz také

Referenční dokumentace

Úvod do obecných typů (Průvodce programováním v C#)

System.Collections.Generic

Metody (Průvodce programováním v C#)

Koncepty

Průvodce programováním v C#