Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az általános metódus olyan metódus, amely típusparaméterekkel deklarálva van az alábbiak szerint:
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
Az alábbi példakód bemutatja, hogyan hívhatja meg a metódust a típusargumentum használatával int :
public static void TestSwap()
{
int a = 1;
int b = 2;
Swap<int>(ref a, ref b);
System.Console.WriteLine(a + " " + b);
}
Kihagyhatja a típusargumentumot is, és a fordító azt fogja következtetni. A következő hívás Swap egyenértékű az előző hívással:
Swap(ref a, ref b);
A típuskövetkező szabályok a statikus metódusokra és a példánymetelyekre is érvényesek. A fordító a megadott metódusargumentumok alapján következtethet a típusparaméterekre; a típusparamétereket nem tudja csak kényszerből vagy visszatérési értékből következtetni. Ezért a típuskövetkezés nem működik paraméterekkel nem rendelkező metódusokkal. A típuskövetkeztetés a fordítási időpontban történik, mielőtt a fordító megpróbálja feloldani a túlterhelt metódus-aláírásokat. A fordító típuskövetkeztetési logikát alkalmaz az azonos nevű általános metódusokra. A túlterhelésfeloldási lépésben a fordító csak azokat az általános metódusokat tartalmazza, amelyeken a típuskövetkeztetés sikeres volt.
Egy általános osztályon belül a nem általános metódusok az alábbi módon férhetnek hozzá az osztályszintű típusparaméterekhez:
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}
Ha olyan általános metódust határoz meg, amely ugyanazokat a típusparamétereket használja, mint a tartalmazó osztály, a fordító a CS0693 figyelmeztetést generál, mert a metódus hatókörében a belsőhöz T megadott argumentum elrejti a külsőhöz Tmegadott argumentumot. Ha olyan általános osztálymetódus meghívására van szükség, amely nem az osztály példányosításakor megadott típusargumentumokkal rendelkezik, fontolja meg a metódus típusparaméterének egy másik azonosítójának megadását az alábbi példában GenericList2<T> látható módon.
class GenericList<T>
{
// CS0693.
void SampleMethod<T>() { }
}
class GenericList2<T>
{
// No warning.
void SampleMethod<U>() { }
}
Korlátozásokkal speciálisabb műveleteket engedélyezhet a metódusok típusparamétereihez. Ez a Swap<T>most elnevezett SwapIfGreater<T>verzió csak a implementálandó IComparable<T>típusargumentumokkal használható.
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;
}
}
Az általános metódusok több típusparaméteren túlterhelhetők. A következő metódusok például ugyanabban az osztályban találhatók:
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }
A típusparamétert a metódus visszatérési típusaként is használhatja. Az alábbi példakód egy metódust mutat be, amely egy típustömböt Tad vissza:
T[] Swap<T>(T a, T b)
{
return [b, a];
}
C# nyelvi specifikáció
További információkért lásd a C# nyelvi specifikációját.