Típustesztelő operátorok és öntött kifejezések – is
, as
és typeof
öntöttek
Ezek az operátorok és kifejezések típusellenőrzést vagy típusátalakítást hajtanak végre. Az is
operátor ellenőrzi, hogy egy kifejezés futásidejű típusa kompatibilis-e egy adott típussal. Az as
operátor explicit módon konvertál egy kifejezést egy adott típusra, ha a futásidejű típusa kompatibilis ezzel a típussal. A öntött kifejezések explicit konverziót végeznek egy céltípusra. Az typeof
operátor lekérte a System.Type példányt egy típushoz.
is operátor
Az is
operátor ellenőrzi, hogy a kifejezés eredményének futásideje kompatibilis-e egy adott típussal. Az is
operátor egy kifejezés eredményét is teszteli egy mintán.
A típustesztelési is
operátorral rendelkező kifejezés az alábbi űrlapot tartalmazza
E is T
where E
is a kifejezés, amely egy értéket ad vissza, és T
egy típus vagy egy típusparaméter neve. E
nem lehet névtelen metódus vagy lambda kifejezés.
Az is
operátor akkor ad true
vissza értéket, ha egy kifejezés eredménye nem null, és az alábbi feltételek bármelyike igaz:
A kifejezés eredményének futásideje a következő
T
: .A kifejezés eredményének futásidejű típusa típusból
T
, implementálási felületbőlT
származik, vagy egy másik implicit referenciakonvertálás létezik belőleT
.A kifejezés eredményének futásidejű típusa egy null értékű értéktípus az alapul szolgáló típussal
T
, és a Nullable<T>.HasValue következőtrue
.A kifejezés eredményének futásidejű típusától a típusig
T
boxing vagy unboxing konverzió létezik.
Az is
operátor nem veszi figyelembe a felhasználó által definiált konverziókat.
Az alábbi példa azt mutatja be, hogy az is
operátor akkor ad vissza true
értéket, ha egy kifejezés eredménye futásidejű típusa egy adott típusból származik, vagyis létezik referenciakonvertálás a típusok között:
public class Base { }
public class Derived : Base { }
public static class IsOperatorExample
{
public static void Main()
{
object b = new Base();
Console.WriteLine(b is Base); // output: True
Console.WriteLine(b is Derived); // output: False
object d = new Derived();
Console.WriteLine(d is Base); // output: True
Console.WriteLine(d is Derived); // output: True
}
}
A következő példa azt mutatja, hogy az operátor figyelembe veszi a is
dobozolást és a dobozolás feloldását, de nem veszi figyelembe a numerikus konverziókat:
int i = 27;
Console.WriteLine(i is System.IFormattable); // output: True
object iBoxed = i;
Console.WriteLine(iBoxed is int); // output: True
Console.WriteLine(iBoxed is long); // output: False
A C#-konverziókkal kapcsolatos információkért lásd a C# nyelv specifikációjának Konverziók fejezetét.
Típustesztelés mintaegyezéssel
Az is
operátor egy kifejezés eredményét is teszteli egy mintán. Az alábbi példa bemutatja, hogyan használható deklarációs minta egy kifejezés futásidejű típusának ellenőrzésére:
int i = 23;
object iBoxed = i;
int? jNullable = 7;
if (iBoxed is int a && jNullable is int b)
{
Console.WriteLine(a + b); // output 30
}
A támogatott mintákról további információt a Minták című témakörben talál.
as operátor
Az as
operátor explicit módon konvertálja egy kifejezés eredményét egy adott hivatkozási vagy null értékű típusra. Ha az átalakítás nem lehetséges, az operátor ad as
vissza null
. Az öntött kifejezéssel ellentétben az as
operátor soha nem ad kivételt.
Az űrlap kifejezése
E as T
ahol E
egy olyan kifejezés, amely egy értéket ad vissza, és T
egy típus vagy egy típusparaméter neve, ugyanazt az eredményt adja, mint a
E is T ? (T)(E) : (T)null
kivéve, hogy csak E
egyszer van kiértékelve.
Az as
operátor csak hivatkozási, null értékű, boxing és unboxing konverziókat tekint. Az operátor nem használható as
felhasználó által definiált átalakítás végrehajtására. Ehhez használjon egy öntött kifejezést.
Az alábbi példa az operátor használatát as
mutatja be:
IEnumerable<int> numbers = new List<int>(){10, 20, 30};
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]); // output: 40
}
Feljegyzés
Ahogy az előző példa is mutatja, össze kell hasonlítania a kifejezés null
eredményét annak as
ellenőrzéséhez, hogy az átalakítás sikeres-e. Az Is operátorral tesztelheti, hogy az átalakítás sikeres-e, és ha sikeres, rendelje hozzá az eredményt egy új változóhoz.
Öntött kifejezés
Az űrlap (T)E
egy öntött kifejezése a kifejezés E
eredményének explicit átalakítását hajtja végre típusra T
. Ha nem létezik explicit átalakítás a típus T
típusától E
kezdve, fordítási időhiba lép fel. Futtatáskor előfordulhat, hogy egy explicit átalakítás nem sikerül, és egy leadott kifejezés kivételt jelenthet.
Az alábbi példa explicit numerikus és referenciakonvertálásokat mutat be:
double x = 1234.7;
int a = (int)x;
Console.WriteLine(a); // output: 1234
int[] ints = [10, 20, 30];
IEnumerable<int> numbers = ints;
IList<int> list = (IList<int>)numbers;
Console.WriteLine(list.Count); // output: 3
Console.WriteLine(list[1]); // output: 20
A támogatott explicit konverziókkal kapcsolatos információkért tekintse meg a C#-nyelv specifikációjának Explicit konverziók szakaszát. Az egyéni explicit vagy implicit típusú átalakítás definiálásáról további információt a felhasználó által definiált konverziós operátorok című témakörben talál.
A () egyéb használati módjai
Zárójelek használatával meghívhat egy metódust, vagy meghívhat egy meghatalmazottat.
A zárójelek másik használata a kifejezések műveleteinek kiértékelési sorrendjének módosítása. További információ: C# operátorok.
typeof operátor
Az typeof
operátor lekérte a System.Type példányt egy típushoz. Az operátor argumentumának typeof
egy típus vagy egy típusparaméter nevének kell lennie, ahogy az alábbi példa mutatja:
void PrintType<T>() => Console.WriteLine(typeof(T));
Console.WriteLine(typeof(List<string>));
PrintType<int>();
PrintType<System.Int32>();
PrintType<Dictionary<int, char>>();
// Output:
// System.Collections.Generic.List`1[System.String]
// System.Int32
// System.Int32
// System.Collections.Generic.Dictionary`2[System.Int32,System.Char]
Az argumentum nem lehet metaadat-széljegyzeteket igénylő típus. Ilyenek például a következő típusok:
dynamic
string?
(vagy bármely null értékű hivatkozástípus)
Ezek a típusok nem jelennek meg közvetlenül a metaadatokban. A típusok az alapul szolgáló típust leíró attribútumokat tartalmaznak. Mindkét esetben használhatja a mögöttes típust. Ahelyett dynamic
, hogy a object
. Ahelyett string?
, hogy a string
.
Az operátort typeof
kötetlen általános típusokkal is használhatja. A kötetlen általános típus nevének tartalmaznia kell a megfelelő számú vesszőt, ami egy kisebb, mint a típusparaméterek száma. Az alábbi példa az operátor kötetlen általános típussal való használatát typeof
mutatja be:
Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]
A kifejezés nem lehet az typeof
operátor argumentuma. A kifejezés eredményének futásidejű típusának példányának lekéréséhez System.Type használja a metódust Object.GetType .
Típustesztelés az typeof
operátorral
typeof
Az operátorral ellenőrizze, hogy a kifejezés eredményének futásideje pontosan egyezik-e egy adott típussal. Az alábbi példa az operátorral végzett típusellenőrzés és az typeof
is operátor közötti különbséget mutatja be:
public class Animal { }
public class Giraffe : Animal { }
public static class TypeOfExample
{
public static void Main()
{
object b = new Giraffe();
Console.WriteLine(b is Animal); // output: True
Console.WriteLine(b.GetType() == typeof(Animal)); // output: False
Console.WriteLine(b is Giraffe); // output: True
Console.WriteLine(b.GetType() == typeof(Giraffe)); // output: True
}
}
Operátorok túlterhelése
A is
, as
és typeof
operátorok nem terhelhetők túl.
A felhasználó által definiált típus nem terhelheti túl az ()
operátort, de definiálhat egyéni típuskonverziókat, amelyeket egy leadott kifejezés hajthat végre. További információ: Felhasználó által definiált konverziós operátorok.
C# nyelvspecifikáció
További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: