Switch benötigen einen konstanten Wert (laut Compiler). Ich möchte einen Wert aus Datei einlesen. Was tun?

  • C#
  • .NET 7–8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von nogood.

    Switch benötigen einen konstanten Wert (laut Compiler). Ich möchte einen Wert aus Datei einlesen. Was tun?

    Moin,

    ich hab eine Klasse:

    C#-Quellcode

    1. public class HgEntryM
    2. {
    3. private readonly AppStateService _appStateService;
    4. public HgEntryM(AppStateService appStateService)
    5. {
    6. _appStateService = appStateService;
    7. }
    8. public Guid Id { get; set; } = Guid.NewGuid();
    9. ...
    10. HgCategoryEnum result = true switch
    11. {//FEHLER es wird ein konstanter Wert für (_appStateService.Cat0End) erwartet
    12. true when ZzProHgPrice is >= 0 and < _appStateService.Cat0End => HgCategoryEnum.Basic,
    13. true when (ZzProHgPrice is >= _appStateService.Cat0End+1 and < _appStateService.Cat1End) => HgCategoryEnum.Econemy,
    14. _ => HgCategoryEnum.Leer
    15. } ;
    16. return result;
    17. }
    18. }


    Funktion:
    Es sollen Kategorien vergeben werden je nach Preisbereich (0-99 € => Basic, 100 - 299 € => Econemy, ...)

    AppStateService, _appStateService:
    Ich hab eine config.txt file die bei Programmstart gelesen wird und alle Startparameter beinhaltet. Dort werden die einzelnen Kategoriebereich-Enden eingelesen. Vorteil ist, ich kann jederzeit ohne neu kompilieren die Grenzen der Kategorien ändern.
    Die Daten stehen in AppState-Obj. und dieses habe ich per Dependency Injection (ich meine das heißt so) in die Klasse eingebunden. Auch wenn ich die Werte in AppStateServcie als 'static' benutze ...meckert der Compiler, dass er konstante Werte benötigt.

    Wie kann ich das lösen?
    codewars.com Rank: 4 kyu

    nogood schrieb:

    If und Switch benötigen einen konstaten Wert
    Switch ja, If nicht.

    C#-Quellcode

    1. if (WhatEver)
    2. {
    3. // ...
    4. }
    funktioniert immer, soferen WhatEver ein bool-Ausdruck ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades Ja soll/ist C# :)

    C#-Quellcode

    1. const decimal e1 = 49m;
    2. const decimal e2 = 199m;
    3. decimal MyValue1 = 150m;
    4. decimal MyValue2 = 40m;
    5. string result1 = MyValue1 switch
    6. {
    7. > 0 and <= e1 => "Case1",
    8. > e1 + 1 and <= e2 => "Case2",
    9. _ => "nix"
    10. };
    11. string result2 = true switch
    12. {
    13. true when MyValue2 is > 0 and <= e1 => "Case1",
    14. true when MyValue2 is > e1 + 1 and <= e2 => "Case2",
    15. _ => "nix"
    16. };
    17. Console.WriteLine($"MyValue1:{result1}\nMyValue2:{result2}");



    Consolen Proj. C# .net 8. Der Code kompiliert und gibt das erwartete Erbenis.
    codewars.com Rank: 4 kyu
    Okay
    schade das es nicht mit is ... and geht! Ich machs mit ​if :)

    Spoiler anzeigen

    C#-Quellcode

    1. const decimal e1 = 49m;
    2. const decimal e2 = 199m;
    3. decimal e1NotConstant = 49m;
    4. decimal e2NotConstant = 199m;
    5. decimal MyValue1 = 150m;
    6. decimal MyValue2 = 40m;
    7. string result1 = MyValue1 switch
    8. {
    9. > 0 and <= e1 => "Case1",
    10. > e1 + 1 and <= e2 => "Case2",
    11. _ => "nix"
    12. };
    13. string result2 = true switch
    14. {
    15. true when MyValue2 is > 0 and <= e1 => "Case1",
    16. true when MyValue2 is > e1 + 1 and <= e2 => "Case2",
    17. _ => "nix"
    18. };
    19. string result3 = string.Empty;
    20. //NOT WORKING (need Constant)
    21. //if (MyValue1 is > 0 and <= e1NotConstant) result3="Case1";
    22. //if (MyValue1 is > e1NotConstant and <= e2NotConstant) result3 = "Case2";
    23. //WORKING (IF but not with the is ... and )
    24. if (MyValue1 > 0 && MyValue1 <= e1NotConstant) result3 = "Case1";
    25. if (MyValue1 > e1NotConstant && MyValue1 <= e2NotConstant) result3 = "Case2";
    26. //WORKING (with Constants)
    27. if (MyValue1 is > 0 and <= e1) result3 = "Case1";
    28. if (MyValue1 is > e1 and <= e2) result3 = "Case2";
    29. Console.WriteLine($"MyValue1:{result1}\nMyValue2:{result2}\nMyValue3:{result3}");​
    codewars.com Rank: 4 kyu