2016-07-20 7 views
2

Ist es möglich, den Standardwert von einer Variablen zu erhalten?find default() Wert von Variable

public static int CountNonDefault<T>(this T[] v) 
{ 
    int count = 0; 

    foreach (var item in v) 
    { 
     if (item.GetType != default(typeof(item))) 
     { 
      count++; 
     } 
    } 

    return count; 
} 

Ich habe ohne Erfolg folgendes versucht:

item.GetType != default(item.GetType().GetProperty("Value").PropertyType) 
item.GetType != default(typeof(item)); 
item.GetType != default(item.GetType()); 
+0

Was ist item.GetType zurückkehren? –

+0

Scheint, den richtigen Typ zurückzugeben, aber bei Verschachtelung als Standard (item.GetType()) Compiler ergibt den Fehler "'Element' ist eine Variable, wird aber wie ein Typ verwendet" –

+0

@JamesDudley Keine Notwendigkeit dafür, überprüfen Sie meine Antwort unten . Verwenden Sie einfach 'default (T)' – user3185569

Antwort

3

Da item Variable generischer Typ ist T dann, wie etwa default(T):

T defaultValue = default(T); 
foreach (T item in v) 
{ 
    if (item != defaultValue) 
    { 

    } 
} 

!= zu verwenden, um zwei zu vergleichen Objekte vom Typ T müssen Sie Ihre Methode wie folgt ändern:

public static int CountNonDefault<T>(this T[] v) : where T : EqualityComparer<T> 

Wenn das nicht eine Option für Dich ist, dann können Sie diese Alternative folgen:

T defaultValue = default(T); 
foreach (T item in v) 
{ 
    if(item == null && defaultValue == null || (item.Equals(defaultValue))) 
    { 

    } 
} 

Dies soll verhindern, .Equals() von werfen ein NullReferenceException

+0

Es funktioniert! Bleiben Sie jetzt bei Ihrem zweiten Beispiel, da ich mit Beschränkungen bei Typparametern nicht vertraut bin; sieht aus, als hätte ich etwas zu lesen! –