where (genel tür kısıtlaması) (C# Başvurusu)where (generic type constraint) (C# Reference)

Genel tanımda yer alan yantümce,genelbirtür,metot,temsilciveyayerelişlevdetürparametreleriiçinbağımsızdeğişkenolarakkullanılantürlerdekısıtlamalarbelirtir.whereThe where clause in a generic definition specifies constraints on the types that are used as arguments for type parameters in a generic type, method, delegate, or local function. Kısıtlamalar, arabirimler, temel sınıflar veya bir genel türün bir başvuru, değer veya yönetilmeyen tür olmasını gerektirebilir.Constraints can specify interfaces, base classes, or require a generic type to be a reference, value, or unmanaged type. Bunlar, tür bağımsız değişkeninin sahip olması gereken özellikleri bildirir.They declare capabilities that the type argument must possess.

Örneğin, tür parametresi MyGenericClass T IComparable<T> arabirimini uygulayan genel bir sınıf bildirebilirsiniz:For example, you can declare a generic class, MyGenericClass, such that the type parameter T implements the IComparable<T> interface:

public class AGenericClass<T> where T : IComparable<T> { }

Not

Bir sorgu ifadesindeki WHERE yan tümcesi hakkında daha fazla bilgi için bkz. WHERE yan tümcesi.For more information on the where clause in a query expression, see where clause.

where Yan tümce bir temel sınıf kısıtlaması de içerebilir.The where clause can also include a base class constraint. Temel sınıf kısıtlaması, bu genel türün tür bağımsız değişkeni olarak kullanılacak bir türün, bu genel tür için bir tür bağımsız değişkeni olarak kullanılacak bir temel sınıf (veya temel sınıf) olarak belirtilen sınıfa sahip olduğunu belirtir.The base class constraint states that a type to be used as a type argument for that generic type has the specified class as a base class (or is that base class) to be used as a type argument for that generic type. Temel sınıf kısıtlaması kullanılırsa, bu tür parametresindeki diğer kısıtlamaların önüne gelmelidir.If the base class constraint is used, it must appear before any other constraints on that type parameter. Bir temel sınıf kısıtlaması olarak bazı türlere izin verilmez: Object, Arrayve ValueType.Some types are disallowed as a base class constraint: Object, Array, and ValueType. C# 7,3, Enum, Delegateve 'denöncetemelsınıfkısıtlamalarıolarakdaizinverilmedi.MulticastDelegatePrior to C# 7.3, Enum, Delegate, and MulticastDelegate were also disallowed as base class constraints. Aşağıdaki örnek, artık temel sınıf olarak belirtime türleri göstermektedir:The following example shows the types that can now be specified as a base class:

public class UsingEnum<T> where T : System.Enum { }

public class UsingDelegate<T> where T : System.Delegate { }

public class Multicaster<T> where T : System.MulticastDelegate { }

Yan tümce türün bir class veya bir structolduğunu belirtebilir. whereThe where clause can specify that the type is a class or a struct. Kısıtlama, öğesinin System.ValueTypetemel sınıf kısıtlamasını belirtme gereksinimini ortadan kaldırır. structThe struct constraint removes the need to specify a base class constraint of System.ValueType. Tür System.ValueType , temel sınıf kısıtlaması olarak kullanılamaz.The System.ValueType type may not be used as a base class constraint. Aşağıdaki örnek, class ve struct kısıtlamalarını göstermektedir:The following example shows both the class and struct constraints:

class MyClass<T, U>
    where T : class
    where U : struct
{ }

Yan tümce notnull kısıtlaması içerebilir. whereThe where clause may include the notnull constraint. notnull Kısıtlama, tür parametresini null yapılamayan türler ile sınırlandırır.The notnull constraint limits the type parameter to non-nullable types. Bu tür bir değer türü veya null yapılamayan bir başvuru türü olabilir.That type may be a value type or a non-nullable reference type. Kısıtlama notnull , C# birnullable enable bağlamdaderlenen kod için 8,0 'den başlayarak kullanılabilir.The notnull constraint is available starting in C# 8.0 for code compiled in a nullable enable context. Diğer kısıtlamaların aksine, bir tür bağımsız değişkeni notnull kısıtlamayı ihlal ederse, derleyici hata yerine bir uyarı oluşturur.Unlike other constraints, if a type argument violates the notnull constraint, the compiler generates a warning instead of an error. Uyarılar yalnızca bir nullable enable bağlamda oluşturulur.Warnings are only generated in a nullable enable context.

Önemli

notnull Kısıtlamayı içeren genel bildirimler, null yapılabilir bir zorunluluvou bağlamında kullanılabilir, ancak derleyici kısıtlamayı zorlamaz.Generic declarations that include the notnull constraint can be used in a nullable oblivious context, but compiler does not enforce the constraint.

#nullable enable
    class NotNullContainer<T>
        where T : notnull
    {

    }
#nullable restore

Yan tümce de bir unmanaged kısıtlama içerebilir. whereThe where clause may also include an unmanaged constraint. Kısıtlama, tür parametresini yönetilmeyen türlerolarak bilinen türlerle sınırlandırır. unmanagedThe unmanaged constraint limits the type parameter to types known as unmanaged types. Kısıtlama unmanaged , içinde C#alt düzey birlikte çalışma kodu yazmayı kolaylaştırır.The unmanaged constraint makes it easier to write low-level interop code in C#. Bu kısıtlama, tüm yönetilmeyen türler arasında yeniden kullanılabilir yordamlar sunar.This constraint enables reusable routines across all unmanaged types. Kısıtlama, class veyastruct kısıtlaması ile birleştirilemez. unmanagedThe unmanaged constraint can't be combined with the class or struct constraint. Kısıtlama, türün bir structolması için şunu uygular: unmanagedThe unmanaged constraint enforces that the type must be a struct:

class UnManagedWrapper<T>
    where T : unmanaged
{ }

Yan tümce bir Oluşturucu new()kısıtlaması de içerebilir. whereThe where clause may also include a constructor constraint, new(). Bu kısıtlama new işleci kullanarak bir tür parametresinin örneğini oluşturmayı mümkün kılar.That constraint makes it possible to create an instance of a type parameter using the new operator. New () kısıtlaması , derleyicinin sağlanan herhangi bir tür bağımsız değişkeninin erişilebilir bir parametresiz-veya varsayılan--oluşturucusu olması gerektiğini bilmesini sağlar.The new() Constraint lets the compiler know that any type argument supplied must have an accessible parameterless--or default-- constructor. Örneğin:For example:

public class MyGenericClass<T> where T : IComparable<T>, new()
{
    // The following line is not possible without new() constraint:
    T item = new T();
}

new() Kısıtlama where yan tümcesinde en son görünür.The new() constraint appears last in the where clause. new() struct Kısıtlama veyaunmanaged kısıtlamalarıyla birleştirilemez.The new() constraint can't be combined with the struct or unmanaged constraints. Bu kısıtlamaların karşılankarşılayan tüm türlerin erişilebilir bir parametresiz oluşturucusu olması gerekir ve new() kısıtlama gereksiz hale getirir.All types satisfying those constraints must have an accessible parameterless constructor, making the new() constraint redundant.

Birden çok tür parametresiyle, her tür where parametresi için bir yan tümce kullanın, örneğin:With multiple type parameters, use one where clause for each type parameter, for example:

public interface IMyInterface { }

namespace CodeExample
{
    class Dictionary<TKey, TVal>
        where TKey : IComparable<TKey>
        where TVal : IMyInterface
    {
        public void Add(TKey key, TVal val) { }
    }
}

Ayrıca, aşağıdaki örnekte gösterildiği gibi genel yöntemlerin tür parametrelerine kısıtlamalar ekleyebilirsiniz:You can also attach constraints to type parameters of generic methods, as shown in the following example:

public void MyMethod<T>(T t) where T : IMyInterface { }

Temsilcilerle ilgili tür parametresi kısıtlamalarını betimleyen sözdiziminin, metodların türüyle aynı olduğunu unutmayın:Notice that the syntax to describe type parameter constraints on delegates is the same as that of methods:

delegate T MyDelegate<T>() where T : new();

Genel Temsilciler hakkında daha fazla bilgi için bkz. Genel Temsilciler.For information on generic delegates, see Generic Delegates.

Kısıtlamaların sözdizimi ve kullanımı hakkında ayrıntılı bilgi için bkz. tür parametrelerindeki kısıtlamalar.For details on the syntax and use of constraints, see Constraints on Type Parameters.

C# dili belirtimiC# language specification

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi.For more information, see the C# Language Specification. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.The language specification is the definitive source for C# syntax and usage.

Ayrıca bkz.See also