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#