Udostępnij za pośrednictwem


Metody ogólne (przewodnik programowania w języku C#)

Metoda ogólna to metoda zadeklarowana z parametrami typu w następujący sposób:

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

Poniższy przykład kodu przedstawia jeden ze sposobów wywoływania metody przy użyciu int argumentu typu:

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

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

Można również pominąć argument typu, a kompilator wywnioskuje go. Następujące wywołanie metody Swap jest równoważne poprzedniemu wywołaniu:

Swap(ref a, ref b);

Te same reguły wnioskowania typu dotyczą metod statycznych i metod wystąpień. Kompilator może wywnioskować parametry typu na podstawie przekazanych argumentów metody; nie może wywnioskować parametrów typu tylko z ograniczenia lub wartości zwracanej. W związku z tym wnioskowanie typu nie działa z metodami, które nie mają parametrów. Wnioskowanie typu występuje w czasie kompilacji, zanim kompilator spróbuje rozpoznać przeciążone sygnatury metody. Kompilator stosuje logikę wnioskowania typu do wszystkich metod ogólnych, które mają taką samą nazwę. W kroku rozwiązywania przeciążenia kompilator zawiera tylko te metody ogólne, na których wnioskowanie typu powiodło się.

W klasie ogólnej metody inne niż ogólne mogą uzyskiwać dostęp do parametrów typu na poziomie klasy w następujący sposób:

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

Jeśli zdefiniujesz metodę ogólną, która przyjmuje te same parametry typu co klasa zawierająca, kompilator generuje ostrzeżenie CS0693 , ponieważ w zakresie metody argument podany dla wewnętrznego T ukrywa argument podany dla zewnętrznego T. Jeśli potrzebujesz elastyczności wywoływania metody klasy ogólnej z argumentami typu innymi niż podane podczas tworzenia wystąpienia klasy, rozważ podanie innego identyfikatora dla parametru typu metody, jak pokazano w GenericList2<T> poniższym przykładzie.

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

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

Użyj ograniczeń, aby włączyć bardziej wyspecjalizowane operacje na parametrach typu w metodach. Ta wersja programu Swap<T>, teraz o nazwie SwapIfGreater<T>, może być używana tylko z argumentami typu, które 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;
    }
}

Metody ogólne mogą być przeciążone na kilku parametrach typu. Na przykład następujące metody mogą znajdować się w tej samej klasie:

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

Można również użyć parametru typu jako zwracanego typu metody. Poniższy przykład kodu przedstawia metodę zwracającą tablicę typu T:

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

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.

Zobacz też