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

Genel tanımdaki yan tümcesi, genel tür, yöntem, temsilci veya yerel işlevde tür parametreleri için bağımsız değişken olarak kullanılan where türlerle ilgili kısıtlamaları belirtir. Kısıtlamalar arabirimleri, temel sınıfları belirterek veya başvuru, değer veya unmanaged türünde genel bir tür gerektirir. Tür bağımsız değişkeninin sahip olması gereken özellikleri bildirerler.

Örneğin, tür parametresinin arabirimi uygulaması AGenericClass için genel bir sınıf T IComparable<T> bildirebilirsiniz:

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

Not

Sorgu ifadesinde where yan tümcesi hakkında daha fazla bilgi için bkz. where yan tümcesi.

yan where tümcesi bir 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 gösterir. Temel sınıf kısıtlaması kullanılıyorsa, bu tür parametresinde diğer kısıtlamalardan önce görün kullanılmalıdır. Bazı türlere temel sınıf kısıtlaması olarak izin verilmiyor: Object , Array ve ValueType . C# 7.3'den önce, , ve temel sınıf kısıtlamaları Enum olarak da izin Delegate MulticastDelegate verilmiyor. Aşağıdaki örnek, artık temel sınıf olarak belirtilebilir türleri gösterir:

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

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

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

C# 8.0 ve sonraki bir içinde null değere değiştirilebilir bağlamda, temel sınıf türünün null uygulanabilirliği zorlar. Temel sınıf null değere sahip olmayan bir sınıfsa Base (örneğin), tür bağımsız değişkeni null değere sahip olmamalıdır. Temel sınıf null değere sahipse (örneğin), tür bağımsız değişkeni null Base? değere değiştirilebilir veya null değerdilemez bir başvuru türü olabilir. Temel sınıf null değerdilemez olduğunda tür bağımsız değişkeni null değere değiştirilebilir bir başvuru türü ise derleyici bir uyarı verir.

yan where tümcesi, türün veya olduğunu class belirterek struct . Kısıtlama, struct temel sınıf kısıtlaması belirtme ihtiyacı ortadan System.ValueType kaldırır. Tür, System.ValueType temel sınıf kısıtlaması olarak kullanılamaz. Aşağıdaki örnek hem hem de class struct kısıtlamalarını gösterir:

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

C# 8.0 ve sonraki bir bağlamda null değere değiştirilebilir bir bağlamda kısıtlama, bir türün null değerdilemez class bir başvuru türü olması gerekir. Null değere değiştirilebilir başvuru türlerine izin vermek için, hem null hem de null değere sahip olmayan başvuru class? türlerine izin veren kısıtlamasını kullanın.

yan where tümcesi kısıtlamayı notnull içerebilir. Kısıtlama, notnull tür parametresini null değere sahip olmayan türler ile sınırlar. Tür bir değer türü veya null değere sahip olmayan bir başvuru türü olabilir. Kısıtlama, notnull bir bağlamda derlenmiş kod için C# 8.0'dan başlayarak nullable enable kullanılabilir. Diğer kısıtlamalardan farklı olarak, tür bağımsız değişkeni kısıtlamayı ihlal notnull ediyorsa, derleyici hata yerine bir uyarı üretir. Uyarılar yalnızca bir bağlamda nullable enable oluşturulur.

Null değere değiştirilebilir başvuru türlerinin ek olarak, genel yöntemlerdeki anlamında olası T? bir belirsizlik vardır. ise T struct ile T? System.Nullable<T> aynıdır. Ancak, T bir başvuru türü ise, T? bunun geçerli bir değer olduğu anlamına null gelir. Geçersiz kılma yöntemleri kısıtlamalara neden olamaya nedeniyle belirsizlik ortaya çıkar. Yeni default kısıtlama bu belirsizlik sorununu çözer. Bir temel sınıf veya arabirim bir yöntemin iki aşırı yüklemesi (biri kısıtlamayı belirten ve biri veya kısıtlaması uygulanmadı) bildirse bunu struct struct class ekleyebilirsiniz:

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 türetilmiş sınıf veya açık arabirim uygulama kısıtlaması olmadan yöntemi geçersiz kılmak için default kısıtlama kullanır. Yalnızca temel yöntemleri veya açık arabirim uygulamalarını geçersiz k kullanılan yöntemlerde 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ı içeren genel bildirimleri null değere değiştirilebilir belirsiz bir bağlamda kullanılabilir, ancak notnull derleyici kısıtlamayı zorlamaz.

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

yan where tümcesi bir kısıtlama da unmanaged içerebilir. unmanagedkısıtlaması, tür parametresini, unmanaged types olarak bilinen türler ile sınırlar. Kısıtlama, unmanaged C# ile alt düzey birlikte çalışma kodu yazmayı kolaylaştırır. Bu kısıtlama, tüm unmanaged türlerde yeniden kullanılabilir yordamlara olanak sağlar. Kısıtlama, unmanaged veya kısıtlaması ile class struct birleştirilenemz. Kısıtlama, unmanaged türün bir olması zorunlu kılınıyor: struct

class UnManagedWrapper<T>
    where T : unmanaged
{ }

yan where tümcesi, bir oluşturucu kısıtlaması da new() içerebilir. Bu kısıtlama, işleci kullanılarak bir tür parametresi örneği oluşturmanızı new mümkün yapar. new() Kısıtlaması, derleyicinin sağlanan herhangi bir tür bağımsız değişkeninin erişilebilir bir parametresiz oluşturucuya sahip olması gerektiğini ansını 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, new() yan tümcesinde en son where görüntülenir. Kısıtlama, new() veya kısıtlamalarıyla struct unmanaged birleştirilene birleştirilmiş olmayacaktır. Bu kısıtlamaları karşılayan tüm türlerin erişilebilir bir parametresiz oluşturucusu olmalıdır ve bu da kısıtlamanın gereksiz new() olmasını sağlar.

Birden çok tür parametresiyle, her tür where parametresi için bir yan tümcesi 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 de kısıtlamalar iliştirebilirsiniz:

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

Temsilcilerde tür parametresi kısıtlamalarını açıklamak için kullanılan söz dizimlerinin yöntemlerin söz dizimleri ile aynı olduğunu fark etmek gerekir:

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ı hakkında ayrıntılı bilgi için bkz. Tür Parametrelerinde 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.