Pergunta

Eu estou usando classes parciais para dividir algumas funcionalidades entre 2 arquivos, mas eu estou recebendo um erro. O que estou fazendo de errado?

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'
    }
}
Foi útil?

Solução

As duas classes parciais no mesmo espaço? Isso poderia ser uma explicação.

Outras dicas

A mesma resposta como @Andrey K, mas em termos simples

Definir a ação de compilação de todas as suas classes parciais para 'Compilar' usando janelas de cada um desses arquivos 'Propriedades'

 janela Propriedades - loading= propriedade ação de compilação ">

namespace diferente?

No início, eu era incapaz de reproduzir o erro.

Quando estas classes parciais são definidos sozinho, dentro de um espaço de nomes, a palavra-chave privada faz com que a compilação falha com "elementos definidos em um namespace não pode ser explicitamente declarado como privado, protegido ou protegido interna" ...

Se eu mantê-los privados e ninho-los dentro de outra classe, tudo funciona bem.

Eu posso reproduzir o erro apenas quando, em um arquivo, eu tenho parte da classe aninhada dentro de outra classe, e em outro arquivo, eu não ninho da classe, e em seguida, remova a palavra-chave privada ... como este:

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

Eu também recebo o erro que você descreveu, se os espaços de nomes diferentes.

Por favor, poste o código inteiro para a solução, porque o código fornecido é inválido C # sintaxe, e não pode ser analisado sem mais contexto.

Editar:

solução: ação de compilação -> complile, nada mais

Vou tentar ser mais específico:

Eu tive uma classe compartilhada entre 3 classes parciais em 3 arquivos diferentes. Em um momento uma chamada de função (de um lado, de uma função declarada em outra parte) começou mostrando erro "não existe no contexto atual". Levei muito tempo até que um cara ajudou me para descobrir que acidentalmente i definir a ação de compilação do arquivo com um parte para "EmbeddedResourse" em vez de "compilação".

Para ação da chave de construção você deve clique direito no arquivo no Solution Explorer, em seguida, escolha Propriedades. Em seguida, altere a ação de compilação.

Esta questão é velho, e minha resposta não é exatamente útil neste caso em particular. Mas pode ser útil para um outro muito raro caso relacionado com classes parciais. Desculpe se o meu Inglês não é clara.

Eu acho que é porque você está declarando sua classe como "privado". Tente alterar o modificador para "interno" para que as duas "metades" da classe pode "ver" uns aos outros dentro do mesmo conjunto.

O erro que eu recebo é:

elementos definidos em um namespace não pode ser explicitamente declarado como privado, protegido ou protegido interna

Eu estou supondo que é uma questão de espaço de nomes como afirmado anteriormente.

Todos os arquivos devem estar na mesma pasta.

I analisar seu código. você declarou classe parcial como classe aninhada isso é motivo para show de erro. porque bcz classe parcial não irá declarar como classe aninhada a palavra-chave parial é dividido em ultiple arquivos para que, cada nae arquivo é o mesmo quando você declarado na classe aninhada que não vai reconhecer.

Um caso canto onde ajuda adicional pode economizar tempo é se você estiver usando uma classe parcial para complementar um Run-time Texto classe gerada do Modelo.

As chances são de que o problema é realmente que namespace sua classe parcial é diferente do namespace da parte gerada dessa classe. Para verificar isso, basta olhar para o código gerado.

Para corrigir isso, você precisa editar o arquivo .csproj para o seu projeto, e na seção sobre esse modelo, adicione a tag <ClassNamespace>:

<Content Include="MyTemplate.tt">
  <Generator>TextTemplatingFilePreprocessor</Generator>
  <ClassNamespace>My.Namespace</ClassNamespace>
  <LastGenOutput>MyTemplate.cs</LastGenOutput>
</Content>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top