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