Tür-test ve atama işleçleri (C# başvuru)Type-testing and cast operators (C# reference)

Tür denetimi veya tür dönüştürme gerçekleştirmek için aşağıdaki işleçleri kullanabilirsiniz:You can use the following operators to perform type checking or type conversion:

  • işleç: bir ifadenin çalışma zamanı türünün belirli bir tür ile uyumlu olup olmadığını denetlemek içinis operator: to check if the runtime type of an expression is compatible with a given type
  • as işleci: çalışma zamanı türü bu türle uyumluysa bir ifadeyi açıkça belirli bir türe dönüştürmek içinas operator: to explicitly convert an expression to a given type if its runtime type is compatible with that type
  • cast işleci (): açık bir dönüştürme gerçekleştirmek içincast operator (): to perform an explicit conversion
  • typeof işleci: bir türün System.Type örneğini almak içintypeof operator: to obtain the System.Type instance for a type

işleçis operator

is İşleci, bir ifade sonucunun çalışma zamanı türünün belirli bir tür ile uyumlu olup olmadığını denetler.The is operator checks if the runtime type of an expression result is compatible with a given type. is Operatör 7,0 C# ' den itibaren bir ifade sonucunu bir düzene göre de sınar.Starting with C# 7.0, the is operator also tests an expression result against a pattern.

Type-Testing is işlecine sahip ifade aşağıdaki biçimdedirThe expression with the type-testing is operator has the following form

E is T

, bir değer döndüren ve T bir tür ya da tür parametresinin adı olan bir ifadedir. Ewhere E is an expression that returns a value and T is the name of a type or a type parameter. Eanonim bir yöntem veya lambda ifadesi olamaz.E cannot be an anonymous method or a lambda expression.

false T true İfadesi, sonucuE null olmayan ve bir başvuru dönüştürmesi, paketleme dönüştürmesi ya da bir kutudan çıkarma dönüştürmesi tarafından türe dönüştürülebileceğinden, öğesini döndürür; Aksi takdirde, döndürür. E is TThe E is T expression returns true if the result of E is non-null and can be converted to type T by a reference conversion, a boxing conversion, or an unboxing conversion; otherwise, it returns false. is İşleci Kullanıcı tanımlı dönüştürmeleri dikkate almaz.The is operator doesn't consider user-defined conversions.

Aşağıdaki örnek, bir ifade sonucunun is çalışma zamanı true türü verilen bir türden türetilse, yani türler arasında bir başvuru dönüştürmesi varsa, işlecinin döndürdüğü gösterilmektedir:The following example demonstrates that the is operator returns true if the runtime type of an expression result derives from a given type, that is, there exists a reference conversion between types:

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
    }
}

Sonraki örnekte, is işlecin hesap paketleme ve kutudan çıkarma dönüştürmelerinin gösterdiği ancak sayısal dönüştürmeleri düşünmeyen bir örnek gösterilmektedir:The next example shows that the is operator takes into account boxing and unboxing conversions but doesn't consider numeric conversions:

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

Dönüşümler hakkında C# daha fazla bilgi için bkz. C# dil belirtiminin dönüşümler bölümü.For information about C# conversions, see the Conversions chapter of the C# language specification.

Model eşleştirme ile test türüType testing with pattern matching

is Operatör 7,0 C# ' den itibaren bir ifade sonucunu bir düzene göre de sınar.Starting with C# 7.0, the is operator also tests an expression result against a pattern. Özellikle, aşağıdaki biçimde tür düzenlerini destekler:In particular, it supports the type pattern in the following form:

E is T v

, bir v değer döndüren bir ifade, bir tür veya tür parametresinin adıdır ve yeni bir yerel değişken türünde T. T Ewhere E is an expression that returns a value, T is the name of a type or a type parameter, and v is a new local variable of type T. Sonucu E null olmayan ve bir başvuru, paketleme E is T v veya kutudan çıkarma dönüştürmesi tarafından T ' e dönüştürülebiliyorsanız, ifade döner true ve şuna atanan sonuç E değeri değişken v.If the result of E is non-null and can be converted to T by a reference, boxing, or unboxing conversion, the E is T v expression returns true and the converted value of the result of E is assigned to variable v.

Aşağıdaki örnek, is işleç kullanımını tür düzeniyle birlikte gösterir:The following example demonstrates the usage of the is operator with the type pattern:

int i = 23;
object iBoxed = i;
int? jNullable = 7;
if (iBoxed is int a && jNullable is int b)
{
    Console.WriteLine(a + b);  // output 30
}

Tür deseni ve diğer desteklenen desenler hakkında daha fazla bilgi için, bkz. deseniyle eşleme.For more information about the type pattern and other supported patterns, see Pattern matching with is.

as işlecias operator

as İşleci, bir ifadenin sonucunu açıkça belirli bir başvuruya veya null yapılabilir değer türüne dönüştürür.The as operator explicitly converts the result of an expression to a given reference or nullable value type. Dönüştürme mümkün değilse, as işleç döndürülür. nullIf the conversion is not possible, the as operator returns null. Atama işlecinin ()aksine, as işleç hiçbir şekilde özel durum oluşturmaz.Unlike the cast operator (), the as operator never throws an exception.

Formun ifadesiThe expression of the form

E as T

, bir değer döndüren ve T bir tür ya da tür parametresinin adı olan bir ifadedir, aynı sonucu şöyle üretir Ewhere E is an expression that returns a value and T is the name of a type or a type parameter, produces the same result as

E is T ? (T)(E) : (T)null

E hariç yalnızca bir kez değerlendirilir.except that E is only evaluated once.

as İşleci yalnızca başvuru, null yapılabilir, kutulama ve kutudan çıkarma dönüştürmelerini dikkate alır.The as operator considers only reference, nullable, boxing, and unboxing conversions. Kullanıcı tanımlı bir dönüştürme as gerçekleştirmek için işlecini kullanamazsınız.You cannot use the as operator to perform a user-defined conversion. Bunu yapmak için, cast işlecini ()kullanın.To do that, use the cast operator ().

Aşağıdaki örnek as işlecinin kullanımını gösterir:The following example demonstrates the usage of the as operator:

IEnumerable<int> numbers = new[] { 10, 20, 30 };
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
    Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]);  // output: 40
}

Not

Yukarıdaki örnekte gösterildiği gibi, dönüştürmenin başarılı olup olmadığını kontrol as null etmek için ifadesinin sonucunu karşılaştırmanız gerekir.As the preceding example shows, you need to compare the result of the as expression with null to check if the conversion is successful. 7,0 ile C# başlayarak, dönüştürme işleminin başarılı olup olmadığını test etmek için, her iki işleci de kullanabilirsiniz ve başarılı olursa sonucunu yeni bir değişkene atayın.Starting with C# 7.0, you can use the is operator both to test if the conversion succeeds and, if it succeeds, assign its result to a new variable.

Cast işleci ()Cast operator ()

Formun (T)E bir atama ifadesi, ifadenin E sonucunun türüne Taçık bir şekilde dönüştürülmesini gerçekleştirir.A cast expression of the form (T)E performs an explicit conversion of the result of expression E to type T. Türünden türüne hiçbir açık dönüştürme E Tyoksa, derleme zamanı hatası oluşur.If no explicit conversion exists from the type of E to type T, a compile-time error occurs. Çalışma zamanında, açık bir dönüştürme başarılı olmayabilir ve bir atama ifadesi bir özel durum oluşturabilir.At run time, an explicit conversion might not succeed and a cast expression might throw an exception.

Aşağıdaki örnek, açık sayısal ve başvuru dönüştürmelerini göstermektedir:The following example demonstrates explicit numeric and reference conversions:

double x = 1234.7;
int a = (int)x;
Console.WriteLine(a);   // output: 1234

IEnumerable<int> numbers = new int[] { 10, 20, 30 };
IList<int> list = (IList<int>)numbers;
Console.WriteLine(list.Count);  // output: 3
Console.WriteLine(list[1]);  // output: 20

Desteklenen açık dönüştürmeler hakkında daha fazla bilgi için, C# dil belirtiminin Açık dönüşümler bölümüne bakın.For information about supported explicit conversions, see the Explicit conversions section of the C# language specification. Özel bir açık veya örtük tür dönüştürme tanımlama hakkında daha fazla bilgi için bkz. Kullanıcı tanımlı dönüştürme işleçleri.For information about how to define a custom explicit or implicit type conversion, see User-defined conversion operators.

() Diğer kullanımlarıOther usages of ()

Ayrıca, bir yöntemi çağırmak veya bir temsilciyi çağırmakiçin parantezleri de kullanabilirsiniz.You also use parentheses to call a method or invoke a delegate.

Diğer parantez kullanımı, bir ifadede işlemlerin değerlendirileceği sırayı ayarlamadır.Other use of parentheses is to adjust the order in which to evaluate operations in an expression. Daha fazla bilgi için bkz C# . işleçler.For more information, see C# operators.

typeof işlecitypeof operator

İşleci bir tür için System.Type örneği edinir. typeofThe typeof operator obtains the System.Type instance for a type. Aşağıdaki örnekte gösterildiği gibi typeof , işlecin bağımsız değişkeni bir tür veya tür parametresinin adı olmalıdır:The argument to the typeof operator must be the name of a type or a type parameter, as the following example shows:

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]

typeof İşleci ilişkisiz genel türler ile de kullanabilirsiniz.You also can use the typeof operator with unbound generic types. İlişkisiz genel türün adı, tür parametrelerinin sayısından küçük olan uygun sayıda virgül içermelidir.The name of an unbound generic type must contain the appropriate number of commas, which is one less than the number of type parameters. Aşağıdaki örnek, sınırsız bir genel türü olan typeof işlecinin kullanımını gösterir:The following example shows the usage of the typeof operator with an unbound generic type:

Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]

İfade, typeof işlecin bağımsız değişkeni olamaz.An expression cannot be an argument of the typeof operator. İfade sonucunun çalışma System.Type zamanı türünün örneğini almak için Object.GetType yöntemini kullanın.To get the System.Type instance for the runtime type of the expression result, use the Object.GetType method.

typeof İşleci ile test türüType testing with the typeof operator

İfade sonucunun çalışma zamanı türünün verilen bir türle tam olarak eşleşip eşleşmediğini denetlemek için işlecinikullanın.typeofUse the typeof operator to check if the runtime type of the expression result exactly matches a given type. Aşağıdaki örnek, typeof işleç ve işleç işleciile gerçekleştirilen tür denetimi arasındaki farkı gösterir:The following example demonstrates the difference between type checking performed with the typeof operator and the is operator:

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
    }
}

Operatör overloadabilityOperator overloadability

is, Veişleçleritypeofaşırıyüklenebilirdeğildir. asThe is, as, and typeof operators are not overloadable.

Kullanıcı tanımlı bir tür () işleci aşırı yükleyemez, ancak bir atama ifadesi tarafından gerçekleştirilebilecek özel tür dönüştürmeleri tanımlayabilir.A user-defined type cannot overload the () operator, but can define custom type conversions that can be performed by a cast expression. Daha fazla bilgi için bkz. Kullanıcı tanımlı dönüştürme işleçleri.For more information, see User-defined conversion operators.

C# dili belirtimiC# language specification

Daha fazla bilgi için, C# dil belirtimininaşağıdaki bölümlerine bakın:For more information, see the following sections of the C# language specification:

Ayrıca bkz.See also