2011-10-03 11 views
9

Czy istnieje sposób sprawdzenia, czy zmienna jest typem wartości typu odniesienia?Jak mogę sprawdzić, czy ogólny parametr metody jest typem wartości?

Imagine:

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

Twoje pytanie jest niejednoznaczne. Czy chcesz wiedzieć, czy konkretna zmienna * zawiera * typ wartości, czy * może zawierać tylko konkretny typ wartości * przez ogólną konstrukcję? Zmienna może być obiektem typu i zawierać int box. Jego zawartość jest typem wartości, ale zmienna nie jest ograniczona tylko do zawierających ints. Na czym ci zależy i dlaczego? –

Odpowiedz

15
bool isValueType = typeof(T).IsValueType; 

zadanie ... to nie ma znaczenia, czy któryś z tych wartości jest null i działa nawet dla pustej tablicy.

+6

uwaga: jeśli chciałeś podać patologiczny przypadek na krawędzi, niech 'T' będzie' obiektem', a niech wartości będą miały ramek. –

+0

Typ parametru metody w tym przypadku byłby System.Object, który jest typem klasy, a * zmienne typu T będą miały semantykę odniesienia, nawet jeśli podstawowym obiektem jest struktura pudełkowa *. Załóżmy na przykład, że 'T' jest typowym ograniczeniem dla' IEnumerator ', a' x' i 'y' są zmiennymi typu' T'. Jeśli 'T' jest typem struct,' x = y' może skopiować stan modułu wyliczającego; jeśli 'T' jest typem odniesienia, * nawet jeśli ten obiekt jest strukturą pudełkową *,' x' będzie współdzielone ze stanem 'y'. – supercat

0

Twój stan będzie wyglądać

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

W rzeczywistości nie jest to bezpieczne, ponieważ "wartość" może potencjalnie mieć wartość "null" zarówno dla typu ref, jak i typu wartości (ta ostatnia poprzez 'Nullable ') –

+0

Gra z ogniem. "wartość" może być pusta :-) – xanatos

+1

Rozumiem, polowanie na punkty reputacyjne przejęło mój koderowy mózg. –

Powiązane problemy