Il più vicino possibile è un vincolo di runtime.
Modifica: Originariamente ho inserito il controllo di runtime nella chiamata del costruttore. Questo in realtà non è ottimale, poiché incorre in ogni istante in ogni istanziazione; Credo che sarebbe molto più sensato mettere il segno di spunta nella costruttore statico , che verrà richiamato una volta per ogni tipo viene utilizzata come parametro T
per il vostro tipo Blah<T>
:
public class Blah<T> {
static Blah() {
// This code will only run ONCE per T, rather than every time
// you call new Blah<T>() even for valid non-string type Ts
if (typeof(T) == typeof(string)) {
throw new NotSupportedException("The 'string' type argument is not supported.");
}
}
}
Ovviamente non è l'ideale, ma se si mettere questo vincolo in posizione e documentare il fatto che string
non è un argomento di tipo supportato (ad esempio, tramite commenti XML), si dovrebbe ottenere da qualche parte vicino a l'efficacia di un vincolo in fase di compilazione.
fonte
2011-08-17 16:41:48
non pensare che questo sia possibile, ma perché avresti bisogno di qualcosa del genere? – Carsten
Qual è il comportamento desiderato quando qualcuno cerca di passare un tipo che non è supportato? –
In realtà stavo tentando di escludere il tipo di stringa, ma si scopre che usando T: struct funziona per quello che sto cercando di fare poiché la mia classe non funzionerà comunque per tipi complessi. –