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:
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 altre informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso 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#)