2009-10-22 11 views
0

J'ai une interface, IFindable qui est implémentée par quelques classes. Une autre classe World contient unAccéder aux interfaces des classes qui ne les implémentent pas?

J'ai mis en place une méthode getItems dans ma classe World, pour retourner la liste des IFindables. Maintenant, j'essaye d'accéder à cette liste de ma classe Default.aspx.cs (ceci est un projet Web). Malheureusement, je ne semble pas capable de le faire puisque cette classe ne comprend pas ce qu'est IFindable. J'obtiens l'erreur suivante:

Inconsistent accessibility: return type 
'System.Collections.Generic.List<IFindable>' is less accessible than 
method 'World.getItems()' 

Pourquoi est-ce? Est-ce que je me suis trompé?

+0

Pouvez-vous poster du code? –

Répondre

7

Il ressemble à votre interface IFindable est pas publique, changer à ce

public interface IFindable ... 

Si votre déclaration actuelle ressemble à ce

interface IFindable ... 

Ensuite, le compilateur utilise l'accessibilité par défaut qui est interne

Interfaces, like classes, can be declared as public or internal types. Unlike classes, interfaces default to internal access. Interface members are always public, and no access modifiers can be applied. http://msdn.microsoft.com/en-us/library/ms173121%28VS.80%29.aspx

+0

J'ai oublié que C# est par défaut privé. Merci! –

+6

C# utilise par défaut "le plus privé disponible dans le contexte" - qui est "internal" pour les types de niveau supérieur et "private" pour les membres dans un type. –

2

Avez-vous défini votre interface comme pu blic?

public interface IFindable 
{ 
... 
} 
+0

Mon exemple de code est plus complet! :-) –

0

Vous pourriez aussi avoir besoin de mettre une instruction à l'aide de l'espace de noms correct en haut de votre fichier de classe

+0

Non, le compilateur sait clairement quel type est impliqué, sinon il s'en serait plaint. Il ne peut pas dire la visibilité à moins qu'il ne connaisse le type. –

2

D'autres ont suggéré de faire votre public interface. Une alternative est de rendre votre méthode getItems() interne.

internal List<IFindable> getItems() 
{ 
    ... 
} 

(Pendant que vous êtes, je vous suggère de le rendre soit GetItems() ou une propriété appelée Items, afin de suivre les conventions .NET getItems() est très Java -like.)

+0

+1 pour ne pas en dire trop sur les intentions de l'affiche. –

+0

Belle suggestion. Les habitudes que vous développez en grandissant avec Java. –

Questions connexes