2009-04-30 12 views
49

Ho il seguente metodo di tipo generico:Come definire il limite di tipo generico ai tipi primitivi?

T GetValue<T>(); 

desidero limitare T a tipi primitivi come int, stringa, galleggiante ma non tipo di classe. So che posso definire generico per tipo di classe come questo:

C GetObject<C>() where C: class; 

non sono sicuro se è possibile per i tipi primitivi e come in tal caso.

risposta

42

È possibile utilizzare questo per limitarla a tipi di valore:

where C: struct 

Lei parla anche di stringa. Sfortunatamente, le stringhe non saranno consentite in quanto non sono tipi di valore.

+0

ma non per la stringa che è annullabile –

+1

E, naturalmente, consente di passare qualsiasi tipo struct definito dall'utente, non solo tipi primitivi. Non sono sicuro che ci sia un modo, in realtà, oltre a definire sovraccarichi per tutti i tipi primitivi predefiniti. –

13

Qui è quello che stai cercando:

T GetObject<T>() where T : struct; 
+0

Dang! Odio quando qualcuno mi picchia al punch. Bello BFree! –

+0

per quanto riguarda la stringa che è primitiva ma di tipo nullable –

+2

@David: stringa non è un tipo primitivo. È un tipo di riferimento che in alcuni casi viene trattato come un tipo primitivo. – Samuel

5

Cosa stai realmente cercando di fare nel metodo? Potrebbe essere che sia effettivamente necessario C per implementare IComparable o un'altra interfaccia. Nel qual caso vuoi qualcosa come

T GetObject<T> where T: IComparable 
9

Non esiste un vincolo generico che corrisponda a questo insieme di cose in modo pulito. Che cosa vuoi veramente fare? Ad esempio, puoi aggirarlo con i controlli di runtime, come un ctor statico (per tipi generici - non così facile per i metodi generici) ...

Tuttavia; la maggior parte delle volte che vedo questo, è perché la gente vuole uno di:

  • per essere in grado di controllare gli elementi per l'uguaglianza: in questo caso utilizzare EqualityComparer<T>.Default
  • per essere in grado di confrontare oggetti/ordinamento: in cui l'uso caso Comparer<T>.Default
  • poter eseguire operazioni aritmetiche: in cui il sostegno' caso utilizzare MiscUtil per generic operators
15

realtà ciò il lavoro certa misura:

public T Object<T>() where T : 
    struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T> 

di limitare a tipi numerici è possibile ottenere alcuni suggerimenti utili dei seguenti campioni definiti per la classe ValueType

Problemi correlati