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#.