2017-10-19 24 views
1

je en train d'écrire une logique de casting enum générique, et je suis tombé sur un phénomène étrange avec la méthode Enum.ToObject:Assigner InvalidValue à la variable Enum (pourquoi est-ce pas lancer une exception?)

[TestClass] 
public class UnitTest1 
{ 
    public enum FixedSet 
    { 
     Value1 = 1, 
     Value2 = 2, 
     Value3 = 3 

    } 

    [TestMethod] 
    public void TestMethod1() 
    { 

     try 
     { 
      var intVal = 123; 
      FixedSet actual = (FixedSet)Enum.ToObject(typeof(FixedSet), intVal); 
      Assert.Fail("Thought an exception should have occured"); 
     }catch(Exception e) 
     { 
      //should have thrown an exception 
     } 
    } 
} 

`` `

Je m'attendrais à ce que cela sorte une exception, puisque 123 n'est pas une valeur du type enum donné, cependant, je suis capable de le définir comme la valeur de cette variable FixedSet.

Pourquoi est-ce autorisé? J'ai toujours pensé cela devrait échouer puisque C# est un langage fortement typé, ce qui est un ENUM fortement défini ...

+0

Non, cela ne fonctionne pas comme ça. 'Enum' est son type sous-jacent. –

+0

copier coller le code, vous verrez qu'il échoue. la question est "Pourquoi cela ne lance-t-il pas une exception" –

+0

[Définir "échouer".] (https://dotnetfiddle.net/Xt38n6) Vous voulez dire qu'il arrive à l'assertion? –

Répondre

6

Selon ISO CEI 23270 (2006):

En particulier, toute valeur de la le type sous-jacent d'une énumération peut être transtypé au type enum, et est une valeur valide distincte de ce type enum.

L'énumération n'hérite pas du type sous-jacent (c'est seulement une syntaxe). Selon la même norme ISO, l'énumération hérite implicitement de System.Enum et de System.ValueType.

Le type System.Enum est la classe de base abstraite de tous les types de ENUM (ce qui est distinct et différent du type sous-jacent de l'ENUM type)

Notez que System.Enum n'est pas lui-même un type ENUM. Il s'agit plutôt d'un type de classe dont dérivent tous les types enum. Le type System.Enum hérite de type System.ValueType (§11.1.1), qui, à son tour, hérite de Type object

Si vous voulez vérifier si la valeur ENUM est valable dans le sens « commun », vous pouvez utilisez la méthode Enum.IsDefined.

+0

ah, donc le fait que le type de données par défaut d'un enum est un int, basé sur l'héritage, il doit suivre les exigences des classes parentes. ça a du sens. merci de clarifier "ça ne marche pas comme ça" c'est plus constructif –

+0

@NathanTregillus non, enum ne "hérite" pas de int. Je vais mettre à jour ma réponse dans une seconde. –