C# elementares Syntax Problem

  • C#

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    C# elementares Syntax Problem

    Ich möchte gern "ChanSort" neu erstellen, weil ich den Hintergrund von hell auf dunkel ändern möchte (ich bin sehbehindert).

    Den Code habe ich mir von GitHub herunter geladen.

    Leider hat die Klasse ChannelInfo im Namespace ChanSort.Api einen C# Syntaxfehler:

    C#-Quellcode

    1. namespace ChanSort.Api
    2. {
    3. public class ChannelInfo
    4. {
    5. private const int MAX_FAV_LISTS = 16;
    6. private string uid;
    7. private string serviceTypeName;
    8. private int newProgramNr;
    9. public virtual bool IsDeleted { get; set; }
    10. public SignalSource SignalSource { get; set; }
    11. public string Source { get; set; }
    12. /// <summary>
    13. /// Index or ID of the data record
    14. /// </summary>
    15. public long RecordIndex { get; set; }
    16. /// <summary>
    17. /// logical record order (might be different from the index, like old LG TLL files with a linked list of record indices)
    18. /// </summary>
    19. public int RecordOrder { get; set; }
    20. /// <summary>
    21. /// original program number from the file, except for channels with IsDeleted==true, which will have the value -1
    22. /// </summary>
    23. public int OldProgramNr { get; set; }
    24. /// <summary>
    25. /// new program number or -1, if the channel isn't assigned a number or has IsDeleted==true
    26. /// </summary>
    27. public int NewProgramNr
    28. {
    29. get => newProgramNr;
    30. set
    31. {
    32. if (value == 0)
    33. {
    34. }
    35. newProgramNr = value;
    36. }
    37. }
    38. ...



    Die Anweisung

    get => newProgramNr;

    Fehlermeldung: Für die Eigenschaft oder den Indexer "ChannelInfo.NewProgramNr" ist eine Zuweisung nicht möglich. Sie sind schreibgeschützt.

    Ich verstehe etwas VB ... aber C# leider nicht sehr gut.

    Was soll z.B. die leere Klammer {} im set ? Das sieht mir iwie falsch aus.

    Vielleicht ist es ja nur ein kleiner Schreibfehler ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bennie“ ()

    @Bennie Willkommen im Forum. :thumbup:
    Welches Studio verwendest Du?
    Das ist neuere C#-Syntax.
    Ändere die Zeile um in

    C#-Quellcode

    1. get { return newProgramNr; }
    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!
    das hat schon mal auf Anhieb funktioniert.

    Leider gibt es noch einen weiteren Syntaxfehler.

    C#-Quellcode

    1. public static void DeleteAssociations(IEnumerable<string> extensions)
    2. {
    3. foreach (var ext in extensions)
    4. {
    5. var progId = "ChanSort" + ext;
    6. DeleteValue($@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{ext}\OpenWithProgids", progId);
    7. Registry.CurrentUser.DeleteSubKeyTree($@"Software\Classes\{progId}", false);
    8. DeleteValue($@"Software\Classes\{ext}\OpenWithProgids", progId);
    9. }
    10. void DeleteValue(string keyPath, string name)
    11. {
    12. using (var key = Registry.CurrentUser.OpenSubKey(keyPath, true))
    13. {
    14. if (key != null)
    15. {
    16. if (name == null)
    17. key.SetValue(null, "");
    18. else
    19. key.DeleteValue(name, false);
    20. }
    21. }
    22. }
    23. }


    Die beiden Aufrufe der Funktion "DeleteValue" liefern den Fehler: Die lokale Variable DeleteValue kann erst verwendet werden, nachdem sie deklariert wurde.

    Ich vermute aber, dass das ein Folgefehler ist, weil die "void DeleteValue(...) Definition mit dem Fehler scheitert:

    "," oder "=" erwartet. (Konstruktorargumente können nicht in einer Deklaration angegeben werden.)

    Das void-Schlüsselwort kann in diesem Kontext nicht verwendet werden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bennie“ ()

    Also ich muss schon sagen, C# ist in den neueren Sprachversionen echt unleserlich geworden.

    Du bist schon in einer Methode (public static void DeleteAssociations) drin und deklarierst da drin eine weitere Methoe (void DeleteValue). Das wurde irgendwann mal erlaubt. Die Methode ist dann von außen nicht sichtbar. In älteren Versionen geht das nicht. Du musst die innere Methode rausschieben.

    Also nicht so:

    C#-Quellcode

    1. public static void DeleteAssociations(IEnumerable<string> extensions)
    2. {
    3. void DeleteValue
    4. {
    5. }
    6. }


    Sondern so:

    C#-Quellcode

    1. public static void DeleteAssociations(IEnumerable<string> extensions)
    2. {
    3. }
    4. void DeleteValue
    5. {
    6. }

    Und vermutlich sollte sie dann private static sein. Also

    C#-Quellcode

    1. public static void DeleteAssociations(IEnumerable<string> extensions)
    2. {
    3. }
    4. private static void DeleteValue
    5. {
    6. }
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ah, da hab ich doch neulich was drüber gelesen. Das ist doch auch relativ neu, dass man in C# eine Prozedur innerhalb einer anderen definieren darf. Ist die Frage, ob das Absicht ist oder ob Du void DeleteValue eigentlich außerhalb von public static void DeleteAssociations platzieren wolltest. Weil: Derzeit isses innerhalb von public static void DeleteAssociations (} an der falschen Position gesetzt?)

    ##########

    Oha, Niko war schneller.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Bennie Diese Frage ist noch nicht beantwortet:

    RodFromGermany schrieb:

    Welches Studio verwendest Du?
    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!
    Das hat leider nicht funktioniert. So hab ich das versucht:

    C-Quellcode

    1. namespace ChanSort.Api
    2. {
    3. public static class FileAssociations
    4. {
    5. ...
    6. public static void DeleteAssociations(IEnumerable<string> extensions)
    7. {
    8. foreach (var ext in extensions)
    9. {
    10. var progId = "ChanSort" + ext;
    11. DeleteValue($@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{ext}\OpenWithProgids", progId);
    12. Registry.CurrentUser.DeleteSubKeyTree($@"Software\Classes\{progId}", false);
    13. DeleteValue($@"Software\Classes\{ext}\OpenWithProgids", progId);
    14. }
    15. }
    16. void DeleteValue(string keyPath, string name)
    17. {
    18. using (var key = Registry.CurrentUser.OpenSubKey(keyPath, true))
    19. {
    20. if (key != null)
    21. {
    22. if (name == null)
    23. key.SetValue(null, "");
    24. else
    25. key.DeleteValue(name, false);
    26. }
    27. }
    28. }
    29. }
    30. }


    void DeleteValue wird immer noch bemängelt:

    Instanzmember können nicht in einer statischen Klasse deklariert werden.

    Wenn ich die Deklaration auch noch aus der statischen Klasse herausnehme, erhalte ich die Fehlermeldung:

    Member, wie z.B. Felder oder Methoden, können nicht direkt in einem Namespace enthalten sein.

    Ich denke, ich gebe die Sache auf ! Ohne sehr gute C# Kenntnisse, werde ich wohl kaum eine Chance haben das Programm zum Laufen zu bringen.

    P.S. Ich verwende Visual Studio 2015

    Bennie schrieb:

    Ich verwende Visual Studio 2015
    Vielleicht steigst Du um auf das Studio 19, das kannst Du einfach so runter laden und Deine Probleme sind Geschichte.
    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!

    Bennie schrieb:

    Instanzmember können nicht in einer statischen Klasse deklariert werden.
    Wenn die Klasse als Static markiert ist, müssen es (wohl) die Prozeduren auch sein. Denn eine Static Class heißt ja: Eine Instanzbildung ist nicht vorgesehen. Wenn Du aber nun eine Methode hast, die nicht als static markiert ist, würde das ja heißen, dass die Methode nur für Klasseninstanzen sinnvoll ist. In einer Klasse, bei der Du markiert hast, dass eine Instanzbildung nicht sinnvoll ist?!?
    Also mach: static void DeleteValue(string keyPath, string name) draus.

    Bennie schrieb:

    Member, wie z.B. Felder oder Methoden, können nicht direkt in einem Namespace enthalten sein.
    Eine globale Methode außerhalb einer Klasse ergibt nun mal in C# und VB.NET keinen Sinn.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Bennie schrieb:

    Wenn du mir das bestätigst
    Ich kann das zu Hause auf Studio 17 testen, das 19er habe ich nicht, das 19er ist nur momentan das modernste.
    Der Code muss ja wohl mit einem moderneren Studio geschrieben worden sein. :D
    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!
    @RodFromGermany hat Recht: mit Visual Studio 2019 wird die Syntax akzeptiert (beim ersten Öffnen der Solution kommt eine Meldung, dass einige Projekte konvertiert werden). Das lässt mich hoffen, dass die Sache doch noch zum Laufen kommt.

    Jetzt habe ich noch Probleme mit dem verwendeten DevExpress:

    Invalid Resx file. Type DevExpress.XtraEditors.LabelAutoSizeMode, DevExpress.XtraEditors.v20.1, Version=20.1.6.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a in the data at line 125, position 4 cannot be located.

    Die DevExpress .dll files habe ich vom Download des ChanSort übernommen und als Verweis hinzufügt.

    Trotzdem erhalte ich die Fehlermeldung. Iwas mache ich da falsch.
    @Bennie Sorry, zu dieser Meldung kann ich nichts sagen.
    Woher hast Du das Projekt, dass ich es mir auch runter laden kann, oder, wenn es klein ist, bereinige es (bin-, obj-, vs-Ordner löschen), zippe es und häng es an:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    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!
    Über Tante Google "Chansort Github" kommt man auf den Download link "github.com" - "PredatH0r/Chansort".

    github.com/PredatH0r/ChanSort

    "source" auswählen ... und downloaden.

    Der .zip file ist 15 MB groß ... ich hab ihn angehängt, werde ihn aber nachher wieder entfernen, damit keine downlevel Version im Netz stehen bleibt.
    Dateien

    Bennie schrieb:

    Die DevExpress .dll files habe ich vom Download des ChanSort übernommen und als Verweis hinzufügt.
    Du willst an dem Projekt weiterentwickeln, dann kauf dir eine DevExpress Lizenz. Es gibt einen Grund, warum die DLLs im SourceCode fehlen, im Release aber dabei sind.

    Oder noch besser, ohne Geld auszugeben. Eröffne in dem Projekt ein Issue in dem du den Dev darum bittest die Themenauswahl die DevExpress immer mitliefert und mit wenigen Klicks hinzugefügt ist, in das Projekt zu integrieren. Dann kannst du als Endanwender das Programm einfach so umstellen, wie es dir beliebt.
    das verstehe ich. Ich will natürlich DevExpress nicht illegal nutzen.

    Mir scheint, dass DevExpress im ChanSort nur zum Testen verwendet wird ...

    Am liebsten würde ich das ausbauen, denn ich will ja nicht testen. Aber das dürfte wohl nicht so einfach sein.

    Na, vermutlich muss ich mich doch von Idee verabschieden, die Farben im ChanSort zu verändern. Das Problem ist halt, dass ich schwarze Schrift auf weißem Grund nicht lesen kann. Und das kann man im ChanSort leider nicht umstellen.
    Wie schon gesagt, eröffne ein Issue in dem Projekt. Da in dem Projekt teilweise DevExpress 20.1 eingebunden ist, gibt es eine große Auswahl an Styles die man dem User zur verfügung stellen kann. Die Styles haben teilweise auch noch Themes. Das ganze sollte für den Entwickler in ein paar Klicks hinzugefügt sein.
    @Bennie Das Studio2017 kommt mit den Quellen nicht klar.
    Sorry.
    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!