2008-10-08 5 views
8

Ich verwende partielle Klassen, um einige Funktionen zwischen zwei Dateien zu teilen, aber ich bekomme einen Fehler. Was mache ich falsch?Fehler bei C# Partial-Klassen

A1.cs:

private partial class A 
{ 
    private string SomeProperty { get { return "SomeGeneratedString"; } }  
} 

A2.cs:

private partial class A 
{ 
    void SomeFunction() 
    { 
     //trying to access this.SomeProperty produces the following compiler error, at least with C# 2.0 
     //error CS0117: 'A' does not contain a definition for 'SomeProperty' 
    } 
} 

Antwort

20

die beiden Teilklassen im gleichen Namensraum sind? Das könnte eine Erklärung sein.

+0

Bis du gehst! Danke –

5

anderer Namespace?

1

Ich denke es liegt daran, dass Sie Ihre Klasse als "privat" deklarieren. Versuchen Sie, den Modifikator in "internal" zu ändern, damit sich die beiden "Hälften" der Klasse in derselben Assembly "sehen" können.

+0

Entsprechend der MSDN-Dokumentation ist privat für Teilklassen in Ordnung, solange beide privat sind. (Der Grund, warum ich das weiß, ist, dass ich dasselbe dachte, da ich nur öffentliche Teilklassen gesehen habe. Also habe ich nachgesehen). http://msdn.microsoft.com/en-us/library/wa80x488.aspx –

+0

Seltsam. Ich habe eine kleine Konsolenanwendung in Visual Studio angeklickt, bevor ich das gepostet habe und den genauen Code des OPs eingefügt habe, und es wird nicht kompiliert. Ändern Sie den Modifikator in "internal" und es kompiliert fein. –

+0

Wäre nicht das erste Mal, MSDN war falsch ...;) Aber das ist wahrscheinlich zu einfach einer Erklärung. Sicher lohnt es sich, die endgültige Antwort zu finden. –

1

Der Fehler, den ich bekommen ist:

Elemente in einem Namensraum definiert ist, können nicht explizit als privat deklariert werden, geschützt oder geschützte interne

Ich vermute, es ist ein Namespace-Problem ist, wie zuvor angegeben.

+0

Ja, das ist der Fehler, den ich auch sehe. –

+0

OK, private/geschützte Klassen funktionieren nur, wenn sie geschachtelte Klassen sind. Der Fehler "Elemente in einem Namespace definiert ..." ist darauf zurückzuführen. Dies erklärt nicht, dass OP wahrscheinlich nicht auf das Grundstück zugreifen kann. Es scheint offensichtlich, dass, wenn er so weit gekommen ist, diese Klassen verschachtelt sind. –

4

Zuerst konnte ich Ihren Fehler nicht reproduzieren.

Wenn diese Teilklassen allein definiert sind, in einem Namensraum, verursacht das Schlüsselwort private den Build mit „Elemente in einem Namespace werden nicht explizit als privat deklariert definiert, geschützt oder interne geschützt“ zum Scheitern verurteilt ...

Wenn ich sie privat halte und sie in einer anderen Klasse neste, funktioniert alles gut.

Ich kann Ihren Fehler nur reproduzieren, wenn ich in einer Datei einen Teil der Klasse innerhalb einer anderen Klasse verschachtelt habe, und in einer anderen Datei die Klasse NICHT verschachtelt und das private Schlüsselwort ... so lösche :

Class1.cs:

namespace stackoverflow.answers 
{ 
    public class Foo 
    { 
     private partial class Bar 
     { 
      private string SomeProperty { get { return "SomeGeneratedString"; } } 
     } 
    } 
} 

Class2.cs:

namespace stackoverflow.answers 
{ 
    partial class Bar 
    { 
     void SomeFunction() 
     { 
      string bar = this.SomeProperty; 
     } 
    }  
} 

ich auch den Fehler, den Sie beschrieben, wenn die Namensräume unterscheiden.

Bitte geben Sie den gesamten Code für die Lösung ein, da der angegebene Code eine ungültige C# -Syntax ist und nicht ohne weiteren Kontext betrachtet werden kann.

0

Ich analysiere Ihren Code. Sie haben die partielle Klasse als geschachtelte Klasse deklariert. Dies ist der Grund für den Fehler. Warum wird die partielle Klasse von bcz nicht als verschachtelte Klasse deklariert, so wird das parial-Schlüsselwort in mehrere Dateien aufgeteilt, so dass jede Datei nae dieselbe ist, wenn Sie in einer verschachtelten Klasse deklariert haben, die sie nicht erkennt.

1

Edit:

Lösung: Build-Aktion -> Complile, sonst nichts

Ich werde versuchen, um genauer zu sein:

ich unter drei Teilklassen geteilt eine Klasse hatte in 3 verschiedene Dateien.Zu einem bestimmten Zeitpunkt hat ein Funktionsaufruf (von einem Teil einer im anderen Teil deklarierten Funktion) den Fehler "existiert nicht im aktuellen Kontext" angezeigt. Es dauerte mich lange, bis jemand helped mir herausfand, dass ich versehentlich die Build-Aktion der Datei mit einem Teil auf "EmbeddedResourse" statt "Compile" setzte.

Um die Build-Aktion zu wechseln, klicken Sie mit der rechten Maustaste auf die Datei im Solution Explorer und wählen Sie Eigenschaften. Ändern Sie dann die Build-Aktion.

Diese Frage ist alt, und meine Antwort ist in diesem Fall nicht gerade hilfreich. Aber es kann in einem anderen sehr seltenen Fall hilfreich sein, der sich auf Teilklassen bezieht. Entschuldigung, wenn mein Englisch nicht klar ist.

+1

Dies könnte eine gute Antwort sein, wenn Sie uns sagen, was genau auf Ihrer lokalen SO gesagt wurde, mit der relevanten Frage verknüpft und übersetzt (vorausgesetzt, es ist nicht auf Englisch). –

+0

@ dohaqatar7 versucht, klarer zu sein –

1

Gleiche Antwort wie @Andrey K aber in einfachen Worten

Stellen Sie die Build-Aktion von allen Teilklassen ‚Compile‘, um die ‚Eigenschaften‘ Fenster jedes dieser Dateien mit

Properties window -> Build action property

Verwandte Themen