2012-04-02 6 views
0

Ich habe ein Klassenbibliotheksprojekt, und mein Namensraum/Hauptklasse sieht wie folgt aus:Das Unterteilen der Klassendatei in partielle Klassen beeinflusst den Gültigkeitsbereich?

Datei: Document.cs

 namespace HtmlEngine 
    { 

     public class Document : IDisposable 
     { ... 

       public class DocumentActionReplaceByTag : IDocumentAction 
       { 

All dies funktioniert gut, und in einem anderen Projekt/Montage Ich habe:

using HtmlEngine; 

... 

DocumentActionReplaceByTag currentDocAction = new HtmlEngine.DocumentActionReplaceByTag("[NEXT_PART]"); 

und es funktioniert perfekt. Allerdings habe ich diese Dokumentklassendatei jetzt in mehrere Dateien unterteilt, die als DocumentActions.cs, DocumentSections.cs bezeichnet werden, und die Hauptfunktionalität in meiner Document.cs-Datei beibehalten. An der Spitze jeder dieser Ich habe:

public partial class Document : IDisposable 
{ 

Jetzt, im raubend Projekt, das ich eine bekommen ‚kann nicht lösen Symbol‚DocumentActionReplaceByTag‘‘ Fehler. Ich habe immer noch meine Referenz auf HtmlEngine.

Die nächste Sache auf dem ‚Netz ich diesen Beitrag finden konnte, war die in ähnlicher Weise meine Notlage beschreibt, aber er war über die Gründe dafür nicht ganz klar passiert: http://www.daniweb.com/software-development/csharp/threads/140673/understanding-partial-classes

Ich habe immer daran geglaubt, partielle Klassen syntaktischen waren Zucker und sie wurden vor der Kompilierung zu einer einzigen Klasse zusammengefasst. Ich habe die Schnittstelle für jede partielle Klassendeklaration wiederholt, nicht sicher, ob das ein Faktor sein könnte.

Warum sollte das jetzt nicht mehr möglich sein?

Antwort

0

Wenn ich Ihren Code verstand correctrly die Linie neuen DocumentActionReplaceByTag für die Erstellung muss wie folgt aussehen:

DocumentActionReplaceByTag currentDocAction = new HtmlEngine.Document.DocumentActionReplaceByTag("[NEXT_PART]"); 

Und was IDisposable, muss er nur in einer Teildatei angegeben werden.

Glinkot, von bereitgestellten Code Ich sehe, dass Ihre DocumentActionReplaceByTag-Klasse in die Klasse Document platziert wird. Die Folowing Probe zeigt, dass Verschachtelte Klassen immer über ParentClass.NestedClass zugreifbar (beachten Sie, dass alle meine Klassen sind in derselben Datei und der Code nicht kompiliert)

namespace SomeNamespace 
{ 
    public class ParentClass 
    { 
     public class NestedClass { } 

       public void SomeMethod() 
       { 
        // This compiles, since nested class is used inside parent class 
        NestedClass nestedClass = new NestedClass(); 
       } 
    } 

    public class AnotherClass 
    { 
     public AnotherClass() 
     { 
      // Not compiles since "NestedClass" is defined as nested class 
      var nestedClass = new NestedClass(); 
      // Will compiles 
      var nestedClass = new ParentClass.NestedClass(); 

      // Not compiles since "NestedClass" is defined as nested class 
      NestedClass nestedClass = new NestedClass(); 
      // Will compiles 
      ParentClass.NestedClass nestedClass = new ParentClass.NestedClass(); 
     } 
    } 
} 

Wenn Sie eine andere Situation haben dann weitere Details zu erläutern.

+0

Danke Andris. Das ist korrekt. Wenn Sie den expliziten Verweis hinzufügen, wird der Job ausgeführt, aber ich möchte weiterhin auf DocumentActionReplaceByTag ohne das Präfix zugreifen. So funktionierte es vor der Aufteilung der Klasse. Ich habe IDisposable von den anderen Dateien entfernt, aber das machte keinen Unterschied. Ich kann nicht hinzufügen "mit HtmlEngin.Document" als dies ist kein Namespace - meine Frage ist, warum es anders verhält (und hoffentlich, was kann ich tun, um es zu lösen). Thx – Glinkot

+0

Ich füge Beispiel hinzu, mit der Verwendung von geschachtelten Klassen. Bitte geben Sie weitere Einzelheiten an, wenn Sie das Gefühl haben, Ihre Situation nicht verstanden zu haben. – Andris

+0

Hallo Andris. In diesem Fall (siehe desc in Originalfrage) verwende ich die Klasse aus einer anderen Assembly/Namespace. Die geschachtelte Klasse könnte ohne Qualifizierung instanziiert werden, wenn die Klassen in einer einzigen Datei sind, und doch, wenn ich sie in Teilklassen unterteile, funktioniert das nicht mehr! Gemäß der Beschreibung des Kerls im Link auf meiner Frage. Ich verstehe nicht, warum ich mich dann jeweils mit Elternklasse qualifizieren müsste. Ich muss nur die Klasse neu kombinieren, wenn es darauf ankommt, und Regionen verwenden. Vielleicht ist das sowieso besser, aber ich frage mich immer noch, warum der Umfang geändert wird. – Glinkot

Verwandte Themen