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

where Genel bir tanımdaki yan tümcesi, genel bir tür, yöntem, temsilci veya yerel işlevdeki tür parametreleri için bağımsız değişken olarak kullanılan türlerdeki kısıtlamaları belirtir. Kısıtlamalar arabirimleri, temel sınıfları belirtebilir veya genel bir türün başvuru, değer veya yönetilmeyen tür olmasını gerektirebilir. Tür bağımsız değişkeninin sahip olması gereken özellikleri bildirir ve bildirilen temel sınıflardan veya uygulanan arabirimlerden sonra yerleştirilmelidir.

Örneğin, tür parametresi arabirimini T uygulayan IComparable<T> genel bir sınıf AGenericClassbildirebilirsiniz:

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

Not

Sorgu ifadesindeki where yan tümcesi hakkında daha fazla bilgi için where yan tümcesine bakın.

where Yan tümcesi temel sınıf kısıtlaması da içerebilir. Temel sınıf kısıtlaması, bu genel tür için tür bağımsız değişkeni olarak kullanılacak bir türün belirtilen sınıfa temel sınıf olarak sahip olduğunu veya bu temel sınıf olduğunu belirtir. Temel sınıf kısıtlaması kullanılırsa, bu tür parametresindeki diğer kısıtlamalardan önce görünmelidir. Bazı türlere temel sınıf kısıtlaması olarak izin verilmez: Object, Arrayve ValueType. Aşağıdaki örnekte artık temel sınıf olarak belirtilebilen türler gösterilmektedir:

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

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

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

Null atanabilir bağlamda, temel sınıf türünün null atanabilirliği zorlanır. Temel sınıf null atanamazsa (örneğin Base), tür bağımsız değişkeni null atanamaz olmalıdır. Temel sınıf null atanabilirse (örneğin Base?), tür bağımsız değişkeni null atanabilir veya null atanamaz bir başvuru türü olabilir. Temel sınıf null atanamaz olduğunda tür bağımsız değişkeni null atanabilir bir başvuru türüyse derleyici bir uyarı döndürür.

where yan tümcesi, türün veya classstructolduğunu belirtebilir. kısıtlaması struct , temel sınıf kısıtlaması belirtme gereksinimini System.ValueTypeortadan kaldırır. Tür System.ValueType , temel sınıf kısıtlaması olarak kullanılamayabilir. Aşağıdaki örnekte hem hem struct de class kısıtlamaları gösterilmektedir:

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

Null atanabilir bir bağlamda, kısıtlama bir türün class null atanamaz bir başvuru türü olmasını gerektirir. Null atanabilir başvuru türlerine izin vermek için, hem null atanabilir hem de boş değer atanamayan başvuru türlerine izin veren kısıtlamasını kullanın class? .

where Yan tümcesi kısıtlamayı notnull içerebilir. kısıtlama, notnull tür parametresini null atanamayan türlere sınırlar. Tür bir değer türü veya boş değer atanamayan bir başvuru türü olabilir. Kısıtlama notnull , bir nullable enable bağlamda derlenen kod için kullanılabilir. Diğer kısıtlamaların aksine, bir tür bağımsız değişkeni kısıtlamayı notnull ihlal ederse, derleyici hata yerine bir uyarı oluşturur. Uyarılar yalnızca bir nullable enable bağlamda oluşturulur.

Boş değer atanabilir başvuru türlerinin eklenmesi, genel yöntemlerdeki anlam T? açısından olası bir belirsizlik oluşturur. ise Tstructile T? aynıdır System.Nullable<T>. Ancak, bir başvuru türü ise T , T? bunun geçerli bir değer olduğu null anlamına gelir. Geçersiz kılma yöntemleri kısıtlamaları içeremediğinden belirsizlik oluşur. Yeni default kısıtlama bu belirsizliği çözer. Bir temel sınıf veya arabirim bir yöntemin iki aşırı yüklemesini bildirdiğinde, biri kısıtlamayı struct belirtir ve diğeri veya structclass kısıtlaması uygulanmaz:

public abstract class B
{
    public void M<T>(T? item) where T : struct { }
    public abstract void M<T>(T? item);

}

Türetilmiş sınıfınızın, türetilmiş sınıfınızda veya açık arabirim uygulamasında kısıtlama olmadan yöntemini geçersiz kılacağını belirtmek için kısıtlamasını kullanırsınız default . Yalnızca temel yöntemleri geçersiz kılan yöntemler veya açık arabirim uygulamaları için geçerlidir:

public class D : B
{
    // Without the "default" constraint, the compiler tries to override the first method in B
    public override void M<T>(T? item) where T : default { }
}

Önemli

Kısıtlamayı notnull içeren genel bildirimler null atanabilir bir belirsiz bağlamda kullanılabilir, ancak derleyici kısıtlamayı zorlamaz.

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

Yan where tümcesi bir unmanaged kısıtlama da içerebilir. kısıtlama, unmanaged tür parametresini yönetilmeyen türler olarak bilinen türlere sınırlar. Kısıtlama, unmanaged C# dilinde alt düzey birlikte çalışma kodu yazmayı kolaylaştırır. Bu kısıtlama, tüm yönetilmeyen türler genelinde yeniden kullanılabilir yordamları etkinleştirir. Kısıtlama unmanaged veya struct kısıtlamasıyla class birleştirilemiyor. Kısıtlama, unmanaged türün olması structgerektiğini zorlar:

class UnManagedWrapper<T>
    where T : unmanaged
{ }

where Yan tümcesi bir oluşturucu kısıtlaması da içerebilir: new(). Bu kısıtlama işlecini kullanarak new tür parametresi örneği oluşturmayı mümkün kılar. new() Kısıtlaması, derleyicinin sağlanan her tür bağımsız değişkenin erişilebilir bir parametresiz oluşturucuya sahip olması gerektiğini bilmesini sağlar. Örnek:

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

Kısıtlama yan new() tümcesinde where en son görünür. Kısıtlama new() veya unmanaged kısıtlamalarıyla struct birleştirilemiyor. Bu kısıtlamaları karşılayan tüm türlerin erişilebilir bir parametresiz oluşturucuya sahip olması gerekir ve bu da kısıtlamanın new() yedekli olmasını sağlar.

Birden çok tür parametresiyle, her tür parametresi için bir where yan tümce kullanın, örneğin:

public interface IMyInterface { }

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

Aşağıdaki örnekte gösterildiği gibi, genel yöntemlerin tür parametrelerine kısıtlamalar da ekleyebilirsiniz:

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

Temsilcilerde tür parametresi kısıtlamalarını açıklama söz diziminin yöntemleriyle aynı olduğuna dikkat edin:

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

Genel temsilciler hakkında bilgi için bkz. Genel Temsilciler.

Kısıtlamaların söz dizimi ve kullanımıyla ilgili ayrıntılar için bkz. Tür Parametrelerindeki Kısıtlamalar.

C# dili belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.

Ayrıca bkz.