2008-10-08 14 views
8

Estoy utilizando clases parciales para dividir algunas funciones entre 2 archivos, pero me aparece un error. ¿Qué estoy haciendo mal?Error con C# Clases parciales

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

Respuesta

20

son las dos clases parciales en el mismo espacio de nombres? Esa podría ser una explicación.

+0

¡listo! Gracias –

5

espacio de nombres diferente?

1

Creo que es porque estás declarando tu clase como "privada". Intente cambiar el modificador a "interno" para que las dos "mitades" de la clase puedan "verse" entre sí dentro del mismo conjunto.

+0

De acuerdo con la documentación de MSDN, privado está bien para las clases parciales, siempre y cuando ambas sean privadas. (La razón por la que sé esto es porque pensé lo mismo, ya que solo he visto clases parciales públicas ... Así que lo busqué). http://msdn.microsoft.com/en-us/library/wa80x488.aspx –

+0

Weird. Cogí una pequeña aplicación de consola en Visual Studio antes de publicar esto y pegué en el código exacto del OP, y no se compilará. Cambia el modificador a "interno" y compila bien. –

+0

No sería la primera vez que MSDN estaba equivocado ...;) Pero eso es probablemente una explicación demasiado simple. Ciertamente vale la pena investigar para encontrar la respuesta definitiva. –

1

El error que consigo es:

elementos definidos en un espacio de nombres no pueden ser declaradas explícitamente como privados, protegidos o protegidos interna

supongo que es un problema de espacio de nombres como se dijo anteriormente.

+0

Sí, ese es el error que veo también. –

+0

OK, resulta que las clases privadas/protegidas solo funcionan si son clases anidadas. El error "Elementos definidos en un espacio de nombres ..." se debe a eso. Esto no explica que OP probablemente no sea para acceder a la propiedad. Parece obvio que si llegó tan lejos, entonces estas son clases anidadas. –

4

Al principio, no he podido reproducir el error.

Cuando estas clases parciales se definen solo, dentro de un espacio de nombres, la palabra clave privada hace que la acumulación de fallar con "elementos definidos en un espacio de nombres no pueden ser declaradas explícitamente como privados, protegidos o protegidos interno" ...

Si los mantengo en privado y los anoto dentro de otra clase, todo funciona bien.

Puedo reproducir su error solo cuando, en un archivo, tengo parte de la clase anidada dentro de otra clase, y en otro archivo, NO jerarquizo la clase, y luego elimino la palabra clave privada ... como esta :

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

también consigo el error que ha descrito, si los espacios de nombres distintos.

Publique todo el código de la solución, porque el código proporcionado es una sintaxis C# no válida, y no se puede examinar sin más contexto.

0

Analizo su código. declaraste clase parcial como clase anidada, esta es la causa para mostrar el error. ¿Por qué la clase parcial bcz no declarará como clase anidada? La palabra clave parial se divide en archivos Ultiple, por lo que cada archivo nae es el mismo cuando se declara en una clase anidada que no reconocerá.

1

Editar:

solución: Acción de generación -> Complile, nada más

Voy a tratar de ser más específicos:

que había una clase compartida entre 3 clases parciales en 3 diferentes archivos.En un momento, una llamada de función (de una parte, de una función declarada en otra parte) comenzó a mostrar el error "no existe en el contexto actual". Me llevó mucho tiempo hasta que un tipo helped me diera cuenta de que accidentalmente establecí la acción de compilación del archivo con una parte en "EmbeddedResourse" en lugar de "Compilar".

Para cambiar la acción de compilación, debe hacer clic derecho en el archivo en el explorador de soluciones, luego seleccione las propiedades. Luego cambia la acción de compilación.

Esta pregunta es antigua, y mi respuesta no es exactamente útil en este caso. Pero puede ser útil en otro caso muy raro relacionado con clases parciales. Lo siento si mi inglés no está claro.

+1

Esta podría ser una buena respuesta si nos dijera qué se dijo exactamente en su SO local, vinculada a la pregunta relevante y traducida (suponiendo que no esté en inglés). –

+0

@ dohaqatar7 intentó ser más claro –

1

La misma respuesta que @Andrey K, pero en términos simples

Configure la acción de construcción de todas sus clases parciales a 'Compilar' utilizando ventanas de cada uno de esos archivos 'Properties'

Properties window -> Build action property

Cuestiones relacionadas