83 votes

Switch case en C# - une valeur constante est attendue

Mon code est le suivant :

public static void Output<T>(IEnumerable<T> dataSource) where T : class
{   
    dataSourceName = (typeof(T).Name);
    switch (dataSourceName)
    {
        case (string)typeof(CustomerDetails).Name.ToString(); :
            var t = 123;
            break;
        default:
            Console.WriteLine("Test");
    }
}

Mais cela ne fonctionne pas. L'instruction case me donne un message d'erreur disant qu'une variable constante est attendue. Aidez-moi, s'il vous plaît, merci !

0 votes

9voto

Korey Points 181

Cela semble fonctionner pour moi, du moins lorsque j'ai essayé sur Visual Studio 2017.

public static class Words
{
     public const string temp = "What";
     public const string temp2 = "the";
}
var i = "the";

switch (i)
{
  case Words.temp:
    break;
  case Words.temp2:
    break;
}

3 votes

Rien à faire avec VS2017. Words.temp et Words.temp2 sont toujours des constantes. Lors de la compilation des instructions Switch, le compilateur remplacera les "valeurs de cas" par leur valeur réelle. Tant que le compilateur est capable d'obtenir une valeur constante à utiliser, cela fonctionnera bien.

3voto

Jesus Ramos Points 15798

Switch est très pointilleux dans le sens où les valeurs dans le switch doivent être une constante de compilation. et aussi la valeur qui est comparée doit être une primitive (ou une chaîne maintenant). Pour cela, vous devez utiliser une instruction if.

La raison peut être liée à la façon dont le C les traite, en créant une table de saut (parce que les valeurs sont des constantes de compilation) et en essayant de copier la même sémantique en n'autorisant pas les valeurs évaluées dans vos cas.

3voto

AksharRoop Points 934

Johnnie, s'il vous plaît aller à travers le guide msdn sur commutateur . En outre, la spécification du langage C# définit clairement le cas d'erreur à la compilation :

- Si le type de l'expression de commutation est sbyte, byte, short, ushort, int, uint, long, ulong, bool, char, string, ou un type enum, ou s'il s'agit du type nullable correspondant à l'un de ces types, alors c'est l'expression de switch qui est utilisée. ou s'il s'agit du type annulable correspondant à l'un de ces types, c'est alors le type régissant l'instruction switch.

- Sinon, exactement une conversion implicite définie par l'utilisateur (§6.4) doit exister entre le type de l'expression de commutation et l'un des types suivants types gouvernants possibles : sbyte, byte, short, ushort, int, uint, long, ulong, char, string, ou, un type nullable correspondant à l'un de ces types. ces types.

- Sinon, si aucune conversion implicite de ce type n'existe, ou si plusieurs une telle conversion implicite existe, une erreur de compilation se produit.

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X