Condividi tramite


where (vincolo di tipo generico) (Guida per programmatori C#)

Aggiornamento: novembre 2007

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 le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 19.1.4 Vincoli

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Introduzione ai generics (Guida per programmatori C#)

Vincolo new (Riferimenti per C#)

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

Altre risorse

Riferimenti per C#