2009-09-04 12 views
4

oeil à l'exemple suivant:Comportement étrange lors de la définition de types de valeur à null en utilisant la réflexion, pourquoi?

public class Test { 
    public int Number { get; set; } 
    public void TestReflection() { 
     Number = 99; 
     Type type = GetType(); 
     PropertyInfo propertyInfo = type.GetProperty("Number"); 
     propertyInfo.SetValue(this, null, null); 
    } 
} 

Dans l'exemple je définition d'une propriété int à null utilisant la réflexion. Je m'attendais à ce que cela lance une exception car null n'est pas une valeur valide pour int. Mais il ne jette pas, il met juste la propriété à 0. Pourquoi?

Mise à jour

Ok, il semble que ce soit à quel point il est. La propriété obtient la valeur par défaut du type de valeur si vous tentez de le définir sur null. J'ai posté une réponse décrivant comment j'ai résolu mon problème, peut-être que cela aidera quelqu'un un jour. Merci à tous ceux qui ont répondu.

Répondre

6

Il définit la valeur par défaut pour le type. Ce comportement n'a pas été mentionné dans le documentation avant, mais maintenant il est:

Si cet objet PropertyInfo est un type de valeur et la valeur est nulle, alors la propriété sera définie sur la valeur par défaut pour ce type.

8

Il s'agit probablement de valeurs par défaut pour le type. Bools probablement aller à faux, aussi, je m'attends.

Identique à l'aide:

default(int); 

J'ai trouvé quelques documents de MSDN le default keyword in C#.

2

Le comportement de SetValue (ou peut-être le liant par défaut) semble un peu dangereux, le code correspondant à cette résolu mon problème:

public class Test { 
    public int Number { get; set; } 
    public void SetNumberUsingReflection(object newValue) { 
     Number = 99; 
     Type type = GetType(); 
     PropertyInfo propertyInfo = type.GetProperty("Number"); 
     if(propertyInfo.PropertyType.IsValueType && newValue == null) { 
      throw new InvalidOperationException(String.Format("Cannot set a property of type '{0}' to null.", propertyInfo.PropertyType)); 
     } else { 
      propertyInfo.SetValue(this, newValue, null); 
     } 
    } 
} 

Peut-être que cela aidera quelqu'un un jour ...

Questions connexes