Udostępnij za pośrednictwem


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

Metoda rodzajowa jest metoda, która jest 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 pokazuje jeden ze sposobów wywołania metody za pomocą int dla 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 i kompilator będzie go rozpoznać.Następujące wywołanie do Swap jest odpowiednikiem poprzedniego wywołania:

Swap(ref a, ref b);

Takie same zasady dla typu wnioskowanie stosuje się do metody statyczne i metody instancji.Kompilator może rozpoznać parametrów typu na podstawie argumenty tej metody, którą przechodzą nie można go rozpoznać parametrów typu tylko z ograniczeniem ani zwracanej wartości.Dlatego typ wnioskowanie nie działa z metod, które mają żadnych parametrów.Wnioskowanie typu występuje w czasie kompilacji, zanim kompilator próbuje rozpoznać podpisy przeciążona metoda.Kompilator dotyczy typu wnioskowanie logiki wszystkie metody rodzajowe, które współużytkują tę samą nazwę.W kroku rozdzielczość przeciążania kompilator obejmuje tylko metody rodzajowe których wnioskowanie typu powiodło się.

W klasą rodzajową metody rodzajowe nie może uzyskać dostęp parametrów typu na poziomie klasy, w następujący sposób:

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

W przypadku zdefiniowania używającej tych samych parametrów typu jako klasa zawierająca metody rodzajowej, ponieważ w ramach zakresu metody argument podany dla wewnętrznej kompilator generuje ostrzeżenie CS0693 T ukrywa argument podany dla zewnętrznego T.Jeśli potrzebna jest elastyczność wywołania metody klasy rodzajowe z argumentami typu inne niż te dostarczone po utworzeniu wystąpienia tej klasy, podaj inny identyfikator dla parametru typu metody, jak pokazano w GenericList2<T> w następującym przykładzie.

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

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

Stosować ograniczenia, aby umożliwić bardziej wyspecjalizowanych operacji w parametrach typu metody.Ta wersja Swap<T>, obecnie nazwanej SwapIfGreater<T>, może być używany tylko z argumentami typu, które 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;
    }
}

Metody rodzajowe mogą być przeciążone na kilka parametrów typu.Na przykład następujące metody wszystkie znajdują się w tej samej klasy:

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

Specyfikacja języka C#

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

Zobacz też

Informacje

Wprowadzenie do typów ogólnych (Przewodnik programowania w języku C#)

System.Collections.Generic

Metody (Przewodnik programowania w języku C#)

Koncepcje

Przewodnik programowania w języku C#