2010-05-13 15 views
8

Tengo 2 escenarios.Ámbito 'léxico' de parámetros de tipo en C#

Esta falla: CS0102

class F<X> 
{ 
    public X X { get; set; } 
} 

de error: El tipo 'F<X>' ya contiene una definición para 'X'

Esto funciona:

class F<X> 
{ 
    class G 
    { 
    public X X { get; set; } 
    } 
} 

La única explicación lógica es que en el segundo fragmento, el parámetro de tipo X está fuera del alcance, lo que no es cierto ...

¿Por qué un parámetro de tipo afecta mis definiciones en un tipo?

IMO, por coherencia, ambos deberían funcionar o ninguno debería funcionar.

¿Alguna otra idea?

PD: Yo lo llamo 'léxico', pero probablemente no es el término correcto.

Actualización:

De acuerdo con la respuesta de Henk, aquí es una versión no genérica que muestra el mismo comportamiento, pero quizás más fácil de asimilar.

falla:

class F 
{ 
    class X { } 
    public X X { get; set; } 
} 

Obras:

class X { } 
class F 
{ 
    public X X { get; set; } 
} 

Por lo que puedo ver, el compilador de C# crea un ámbito léxico en la definición de tipo de limites.

También implica que los tipos y nombres de miembros viven en la misma 'ubicación' (o namespace en términos de LISP).

+0

No veo por qué la primera no debería funcionar, ¿alguien capaz de reproducir el error del compilador? –

+0

@Ori: solo pruébalo. :) – leppie

+0

De acuerdo con su actualización, parece que Marcelo respondió su pregunta: demostró lo mismo. – Kobi

Respuesta

3

La clase G presenta un ámbito de nombre distintivo. Si omite las reglas predeterminadas, las 2 versiones se convierten en:

public F<X>.X F<X>.X { get; set; } // error 
public F<X>.X F<X>.G.X { get; set; } // OK 
+0

Gracias, eso parece tener un poco de sentido :) Y por qué: clase F { clase X {} public X X {get; conjunto; } } también falla. – leppie

2

X se define como un tipo en el alcance de F. Es similar a esto:

class F 
{ 
    public void X(); 

    public int X(); // Bad, trying to redefine X. 

    class G 
    { 
    public string X(); // OK, different scope 
    } 
} 

F.X no está fuera del alcance de G, pero esto no impide que G desde la definición de un nuevo X.

+0

Lo siento, su X es miembro, el mío es un parámetro de tipo. Puedo entender eso. – leppie

+0

Lamento ser obtuso, @leppie. ¿Estás de acuerdo o en desacuerdo conmigo? –

+0

Estoy en desacuerdo. :) – leppie

Cuestiones relacionadas