Share via


where (vincolo di tipo generico) (Riferimenti per C#)

In una definizione di tipo generico, la clausola where viene utilizzata per specificare i vincoli sui tipi che possono essere utilizzati come argomenti per un parametro di tipo definito in una dichiarazione generica. È possibile ad esempio dichiarare una classe generica, MyGenericClass, in modo tale che il parametro di tipo T implementi l'interfaccia IComparable<T>:

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

Nota

Per ulteriori informazioni sulla clausola where in un'espressione di query, vedere Clausola where (Riferimento C#).

Oltre ai vincoli di interfaccia, una clausola where può comprendere un vincolo di classe base, mediante cui si stabilisce che un tipo deve disporre della classe specificata come classe base o essere esso stesso tale classe, per essere utilizzato come argomento di tipo per tale tipo generico. Se si utilizza un vincolo di questo tipo, è necessario inserirlo prima di qualsiasi altro vincolo su tale parametro di tipo.

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

La clausola where può anche includere un vincolo di costruttore. È possibile creare un'istanza di un parametro di tipo utilizzando il nuovo operatore; tuttavia, per eseguire questa operazione è necessario impostare sul parametro di tipo il vincolo di costruttore, new(). Il vincolo new() comunica al compilatore che ogni argomento di tipo fornito deve disporre di un costruttore senza parametri, o predefinito, accessibile. Di seguito è riportato un esempio.


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

Il vincolo new() viene visualizzato per ultimo nella clausola where.

Con i parametri a più tipi, utilizzare una clausola where per ogni parametro di tipo, ad esempio:

    interface IMyInterface
    {
    }

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

È inoltre possibile associare vincoli a parametri di tipo di metodi generici, nel modo seguente:

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

Si noti che la sintassi per descrivere i vincoli di parametri di tipo sui delegati è uguale a quella dei metodi:

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

Per informazioni sui delegati generici, vedere Delegati generici.

Per informazioni dettagliate sulla sintassi e l'utilizzo di vincoli, vedere Vincoli sui parametri di tipo.

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.

Vedere anche

Riferimenti

Introduzione ai generics (Guida per programmatori C#)

Vincolo new (Riferimenti per C#)

Vincoli sui parametri di tipo (Guida per programmatori C#)

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#