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.
Általános típusparaméterek esetén a out kulcsszó azt határozza meg, hogy a típusparaméter kovariant. Használja a kulcsszót out általános felületeken és meghatalmazottakban.
A kovariancia lehetővé teszi, hogy az általános paraméter által megadottnál származtatottabb típust használjon. Ez a funkció lehetővé teszi a kovariant interfészeket megvalósító osztályok implicit átalakítását és a delegált típusok implicit konvertálását. A kovariancia és a contravariance támogatja a referenciatípusokat, de nem támogatják az értéktípusokat.
A kovariant típusú paraméterrel rendelkező interfészek lehetővé teszik a metódusok számára, hogy a típusparaméter által megadottaknál több származtatott típust adjanak vissza. Mivel például a .NET-ben IEnumerable<T>a T típus kovarianciáns, speciális átalakítási módszerek használata nélkül rendelhet hozzá egy ilyen típusú objektumot IEnumerable<string>IEnumerable<object> .
Kovátriai delegáltat hozzárendelhet egy másik, azonos típusú delegálthoz, de származtatottabb általános típusparaméterrel.
További információ: Kovariancia és kontravariancia.
A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.
A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.
Jótanács
Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.
Az alábbi példa bemutatja, hogyan deklarálhat, bővíthet és implementálhat egy kovariantikus általános felületet. Azt is bemutatja, hogyan használhat implicit konverziót a kovariantikus felületet implementáló osztályokhoz.
// Covariant interface.
interface ICovariant<out R> { }
// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }
// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }
class Program
{
static void Test()
{
ICovariant<Object> iobj = new Sample<Object>();
ICovariant<String> istr = new Sample<String>();
// You can assign istr to iobj because
// the ICovariant interface is covariant.
iobj = istr;
}
}
Egy általános felületen deklaráljon egy kovarians típusparamétert, ha megfelel a következő feltételeknek:
A típusparamétert csak az interfészmetódusok visszatérési típusaként használja, és nem használja metódusargumentumok típusaként.
Megjegyzés:
Ez a szabály egyetlen kivételt képez. Ha egy kovariant felület metódusparaméterként contravariant generic delegáltat használ, a kovariant típust általános típusparaméterként használhatja ehhez a delegálthoz. A kovariant és a contravariant általános meghatalmazottakról további információt a Delegáltak varianciája és a Variance használata func és action generic meghatalmazottakhoz című témakörben talál.
A típusparamétert nem használja általános kényszerként a felületi metódusokhoz.
Az alábbi példa bemutatja, hogyan deklarálhat, hozhat létre és hívhat meg kovariant általános meghatalmazottat. Azt is bemutatja, hogyan konvertálhat implicit módon delegált típusokat.
// Covariant delegate.
public delegate R DCovariant<out R>();
// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }
public static Button SampleButton()
{ return new Button(); }
public void Test()
{
// Instantiate the delegates with the methods.
DCovariant<Control> dControl = SampleControl;
DCovariant<Button> dButton = SampleButton;
// You can assign dButton to dControl
// because the DCovariant delegate is covariant.
dControl = dButton;
// Invoke the delegate.
dControl();
}
Egy általános meghatalmazottban deklaráljon egy kovarians típust, ha csak metódus-visszatérési típusként használja, és nem metódusargumentumokhoz.
C# nyelvspecifikáció
További információkért lásd a C# nyelvi specifikációját. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.