2 Stimmen

Namenskonflikt zwischen Typ des System-Namespaces und benutzerdefiniertem Typ in unterschiedlichen Assemblys

Ich habe ein Problem mit der Namensauflösung eines Typs namens Action. Während das Projekt in einem frühen Stadium war und alles im selben Projekt deklariert wurde, bevorzugte der Compiler immer meine eigene Klasse. Jedoch, seit es notwendig geworden ist, das Projekt in verschiedene Assemblys zu trennen (z.B. ProjectName.Common, ProjectName.Engine, etc.), ist ein Namenskonflikt zwischen System.Action und ProjectName.Common.Action aufgetreten.

Ich habe herausgefunden, dass ich den internen Namespace des Projekts explizit innerhalb der Namespace-Deklaration einer beliebigen Projektdatei importieren kann, während System immer noch im globalen Gültigkeitsbereich importiert wird, wie ursprünglich vom IDE erstellt. Tatsächlich funktioniert das, sieht aber nicht sehr elegant aus. Gibt es einen besseren Ansatz, um dieses Problem zu lösen? Das Umbenennen meiner Action-Klasse ist keine akzeptable Lösung, da es sich um einen ziemlich häufigen Domänennamen handelt und nicht um etwas Besonderes wie z.B. Math, usw.

Code Beispiel:

using System;
...

namespace ProjectName.Engine {

    using ProjectName.Common;

    class SomeClass {

        private Action action;
        ...

    }

}

Vielleicht kennt jemand ein Rezept für solche Namenskonflikte ...

1voto

moribvndvs Punkte 41575

Was du getan hast, ist eine angemessene Art, mit diesem Problem umzugehen. Du kannst auch einen Alias verwenden, um einen temporären Namen zu geben oder dem Compiler einen Hinweis zu geben, welchen du bevorzugst. Das erspart dir die Mühe, alle Typen in ProjectName.Common über System zu bevorzugen.

    using System;
    using ProjectName.Common
    ...

    namespace ProjectName.Engine {

        using Action = ProjectName.Common.Action;

        class SomeClass {

            private Action action;
            ...

        }

   }

1voto

Justin Pihony Punkte 63852

Ich würde trotzdem vorschlagen, Ihren Cast explizit zu machen. Jedes Mal, wenn Sie mehrdeutige Verweise haben, sollte dies erfolgen, insbesondere wenn Sie die gleichen Namen wie im System haben. Andernfalls bitten Sie um Verwirrung von jedem neuen Programmierer, der den Code übernehmen muss. Der neue Programmierer wird Action sehen und die System-Version annehmen, wenn sie nicht explizit aufgebaut ist. Obwohl dies ausführlicher ist, drückt es den Code und seine Absicht auf klare Weise aus. Das sind nur meine zwei Cent. Sie können dies auf die gleiche Weise mit Aliassen erreichen, wie es andere vorgeschlagen haben.

0voto

Versuchen Sie, Verwendung Action = ProjektName.Common.Action;

Sie müssen dies in jeder Code-Datei angeben, die auf diese Klasse verweisen muss, und wenn diese Code-Datei auch den System.Action-Delegaten verwenden muss, dann können Sie ihn einfach in Ihrem Code als "System.Action" vollständig qualifizieren.

Sie können natürlich auch einen Alias für den System.Action-Delegaten vergeben, aber ich finde es weniger verwirrend, den vollqualifizierten Namen zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X