Question

J'utilise des classes partielles pour diviser certaines fonctionnalités entre 2 fichiers, mais je reçois une erreur. Qu'est-ce que je fais mal?

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'
    }
}
Était-ce utile?

La solution

Les deux classes partielles sont-elles dans le même espace de noms? Cela pourrait être une explication.

Autres conseils

Même réponse que @Andrey K mais en termes simples

Définissez l'action de construction de toutes vos classes partielles sur "Compiler" à l'aide de la fenêtre "Propriétés" de chacun de ces fichiers

 Fenêtre Propriétés - loading= Propriété d'action de génération ">

espace de noms différent?

Au début, j’ai été incapable de reproduire votre erreur.

Lorsque ces classes partielles sont définies seules, à l'intérieur d'un espace de noms, le mot clé private provoque l'échec de la construction avec & "; les éléments définis dans un espace de noms ne peuvent pas être explicitement déclarés comme étant privés, protégés ou internes internes &". ; ...

Si je les garde privés et les imbrique dans une autre classe, tout se passera bien.

Je ne peux reproduire votre erreur que si, dans un fichier, une partie de la classe est imbriquée dans une autre classe, et dans un autre fichier, je n'emboîte PAS la classe, puis supprime le mot clé private ... comme ceci:

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

J'obtiens également l'erreur que vous avez décrite si les espaces de noms diffèrent.

Envoyez le code complet de la solution, car le code fourni est une syntaxe C # non valide et ne peut pas être examiné sans davantage de contexte.

Modifier:

solution: action de construction - > Complile, rien d'autre

Je vais essayer d'être plus précis:

J'ai eu une classe partagée entre 3 classes partielles dans 3 fichiers différents. À un moment donné, un appel de fonction (d'une partie d'une fonction déclarée dans une autre partie) a commencé à afficher l'erreur & "; N'existe pas dans le contexte actuel &"; Il m'a fallu longtemps avant qu'un gars m'a aidé à comprendre que j'ai accidentellement défini l'action de compilation du fichier avec un partie à " EmbeddedResourse " au lieu de & "Compiler &";.

Pour changer d'action de construction, vous devez cliquer avec le bouton droit de la souris sur le fichier dans l'explorateur de solutions, puis choisir les propriétés. Puis changez l’action de compilation.

Cette question est ancienne et ma réponse n’est pas vraiment utile dans ce cas précis. Mais cela peut être utile dans un autre cas très rare lié à des classes partielles. Désolé si mon anglais n'est pas clair.

Je pense que c'est parce que vous déclarez votre classe comme & "private &"; Essayez de changer le modificateur en & Quot; internal & Quot; de sorte que les deux & "; moitiés &"; de la classe peut & "voir &"; mutuellement au sein du même ensemble.

L'erreur que je reçois est la suivante:

Les éléments définis dans un espace de noms ne peuvent pas être explicitement déclarés comme étant privés, protégés ou internes protégés

Je suppose que c'est un problème d'espace de noms, comme indiqué précédemment.

Tous les fichiers doivent figurer dans le même dossier.

J'analyse votre code. vous avez déclaré une classe partielle en tant que classe imbriquée, ce qui entraîne une erreur. pourquoi la classe partielle bcz ne déclarera pas comme classe imbriquée, le mot clé parial est divisé en plusieurs fichiers. Ainsi, chaque fichier nae est identique lorsque vous déclarez qu'il n'est pas reconnu dans la classe imbriquée.

Dans certains cas, une aide supplémentaire peut vous faire gagner du temps si vous utilisez une classe partielle pour compléter la classe générée par un modèle de texte au moment de l'exécution.

Il est probable que le problème réside en fait dans le fait que l'espace de nom de votre classe partielle est différent de celui de la partie générée de cette classe. Pour vérifier cela, il suffit de regarder le code généré.

Pour résoudre ce problème, vous devez modifier le fichier .csproj de votre projet. Dans la section relative à ce modèle, ajoutez la <ClassNamespace> balise:

.
<Content Include="MyTemplate.tt">
  <Generator>TextTemplatingFilePreprocessor</Generator>
  <ClassNamespace>My.Namespace</ClassNamespace>
  <LastGenOutput>MyTemplate.cs</LastGenOutput>
</Content>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top