Domanda

Sto utilizzando classi parziali per dividere alcune funzionalità tra 2 file, ma ricevo un errore.Che cosa sto facendo di sbagliato?

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'
    }
}
È stato utile?

Soluzione

Le due classi parziali sono nello stesso spazio dei nomi? Potrebbe essere una spiegazione.

Altri suggerimenti

Stessa risposta di @Andrey K ma in termini semplici

Imposta l'azione di compilazione di tutte le tue classi parziali su 'Compila' usando le finestre 'Proprietà' di ciascuno di quei file

 Finestra Proprietà - loading= Crea proprietà azione ">

spazio dei nomi diverso?

All'inizio non sono riuscito a riprodurre il tuo errore.

Quando queste classi parziali vengono definite da sole, all'interno di uno spazio dei nomi, la parola chiave private provoca il fallimento della compilazione con "Gli elementi definiti in uno spazio dei nomi non possono essere dichiarati esplicitamente come privati, protetti o interni protetti"...

Se li tengo privati ​​e li annido in un'altra classe, tutto funziona bene.

Posso riprodurre il tuo errore solo quando, in un file, ho parte della classe annidata all'interno di un'altra classe e in un altro file NON annido la classe, quindi rimuovo la parola chiave private...come questo:

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;
        }
    }    
}

Ottengo anche l'errore che hai descritto se gli spazi dei nomi differiscono.

Pubblica l'intero codice per la soluzione, perché il codice fornito non ha una sintassi C# valida e non può essere esaminato senza ulteriore contesto.

Modifica

soluzione: build action - > Complile, nient'altro

Proverò ad essere più specifico:

Avevo una classe condivisa tra 3 classi parziali in 3 file diversi. In un momento una chiamata di funzione (da una parte, di una funzione dichiarata nell'altra parte) ha iniziato a mostrare l'errore & Quot; non esiste nel contesto corrente & Quot ;. Mi ci è voluto molto tempo prima che qualche ragazzo mi ha aiutato a capire che accidentalmente ho impostato l'azione di compilazione del file con uno parte in " EmbeddedResourse " anziché " Compila " ;.

Per cambiare l'azione di compilazione è necessario fare clic con il pulsante destro del mouse sul file in Esplora soluzioni, quindi scegliere Proprietà. Quindi modifica l'azione di compilazione.

Questa domanda è vecchia e la mia risposta non è esattamente utile in questo caso. Ma può essere utile in un altro caso molto raro relativo alle classi parziali. Scusate se il mio inglese non è chiaro.

Penso che sia perché stai dichiarando la tua classe come " private " ;. Prova a cambiare il modificatore in & Quot; internal & Quot; in modo che le due " metà " della classe può " vedere " l'un l'altro all'interno dello stesso assieme.

L'errore che ottengo è:

Gli elementi definiti in uno spazio dei nomi non possono essere dichiarati esplicitamente come interni privati, protetti o protetti

Suppongo sia un problema di spazio dei nomi come precedentemente affermato.

Tutti i file dovrebbero essere nella stessa cartella.

Analizzo il tuo codice. hai dichiarato la classe parziale come classe nidificata questo è causa di errore. perché la classe parziale bcz non dichiarerà come classe nidificata la parola chiave parentale è divisa in file multipli quindi, ogni file nae è lo stesso quando dichiarato nella classe nidificata che non riconoscerà.

Un caso angolare in cui un ulteriore aiuto può farti risparmiare tempo è se stai usando una classe parziale per integrare una classe generata da un modello di testo runtime.

Probabilmente il problema è che lo spazio dei nomi della tua classe parziale è diverso dallo spazio dei nomi della parte generata di quella classe. Per verificarlo, basta guardare il codice generato.

Per risolvere il problema, è necessario modificare il .csproj file per il progetto e nella sezione relativa a quel modello, aggiungere il tag <ClassNamespace>:

<Content Include="MyTemplate.tt">
  <Generator>TextTemplatingFilePreprocessor</Generator>
  <ClassNamespace>My.Namespace</ClassNamespace>
  <LastGenOutput>MyTemplate.cs</LastGenOutput>
</Content>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top