2011-10-03 20 views
9

C'è un modo per verificare se una variabile è un tipo di valore di tipo di riferimento?Come posso verificare se un parametro del metodo generico è un tipo di valore?

Immaginate:

private object GetSomething<T>(params T[] values) 
{ 
    foreach (var value in values) 
    { 
     bool is ValueType; // Check if 'value' is a value type or reference type 
    } 
} 
+3

La tua domanda è ambigua. Vuoi sapere se una particolare variabile * contiene * un tipo di valore, o * può contenere solo un particolare tipo di valore * dalla costruzione generica? Una variabile potrebbe essere di tipo oggetto e contenere un int in scatola. Il suo contenuto è un tipo di valore, ma la variabile non è limitata a contenere solo valori inte. A cosa tieni, e perché? –

risposta

15
bool isValueType = typeof(T).IsValueType; 

lavoro fatto ... non importa se uno dei valori è null, e funziona ancora per un array vuoto.

+6

: se si desidera fornire un caso limite, lasciare che 'T' sia' object' e lasciare che i valori siano strutture boxate. –

+0

Il tipo del parametro del metodo in questo caso sarebbe System.Object, che è un tipo di classe, e * le variabili di tipo T avranno semantica di riferimento, anche quando l'oggetto sottostante è una struct * in scatola. Ad esempio, supponiamo che 'T' sia un generico vincolato a' IEnumerator 'e' x' e 'y' sono variabili di tipo' T'. Se 'T' è un tipo struct,' x = y' può copiare lo stato dell'enumeratore; se 'T' è un tipo di riferimento, * anche se quell'oggetto è una struttura in box *,' x' condividerebbe lo stato di 'y'. – supercat

0

tua condizione sarà simile

var cond = false; 
if(value != null) 
    cond = value.GetType().IsValueType 
+3

In realtà, questo non è sicuro, dal momento che 'value' può essere potenzialmente' null' sia per ref-type sia per value-type (quest'ultimo tramite 'Nullable ') –

+0

Giocare con il fuoco. 'value' potrebbe essere nullo :-) – xanatos

+1

Vedo, la ricerca di punti di reputazione ha preso il sopravvento sul mio cervello di coder. –

Problemi correlati