2010-05-12 7 views
0

Je reçois l'erreur:Erreur CS0117: Namespace.A ne contient pas la définition de l'interface


« Namespace.A » ne contient pas une définition pour « MyObjectInterface » et aucune méthode d'extension « MyObjectInterface » accepter un premier argument de type ...


Je l'ai regardé et thisthis et ne semble appliquer.

Le code ressemble à:

public abstract class Base 
{ 
    public IObject MyObjectInterface { get; set; } 
} 

public class A : Base 
{ 
    /**/ 
} 

public class Implementation 
{ 
    public void Method() 
    { 
     Base obj = new A(); 
     obj.MyObjectInterface = /* something */; // Error here 
    } 
} 
  • IObject est défini dans un ensemble séparé, mais:

    • IObject est dans un ensemble/espace de nom séparé
    • Base et A sont dans le même assemblage/espace de nommage avec des directives d'utilisation correctes
    • La mise en oeuvre est dans un troisième espace de noms d'assembly séparé, également avec des directives d'utilisation correctes.
  • casting à A avant d'essayer de mettre MyObjectInterface ne fonctionne pas

  • Plus précisément, je suis en train de définir la valeur de MyObjectInterface à un objet fictif (bien que, j'ai créé un faux lieu sans résultat

J'ai essayé tout ce que je peux penser. S'il vous plaît aider avant de perdre plus de cheveux.

modifier Je ne peux pas reproduire l'erreur en créant une application de test soit, ce qui est la raison pour laquelle je suis ici et pourquoi je suis frustré.

@Reed Copsey:/* quelquechose */est soit un NUnit.DynamicMock (IMailer) .MockInstance, soit un objet Fake que j'ai créé et qui hérite de IObject et qui renvoie juste des valeurs prédéfinies. Sangha: J'ai vérifié et aucun autre assemblage référencé n'a de définition pour un objet IObject (plus précisément, il s'agit d'un IMailer). Il est vrai que IntelliSense capte la propriété, mais quand je compile, je reçois CS0117. Je peux même 'Go To Definition' dans l'implémentation, et cela m'amène à l'endroit où je l'ai défini.

+0

J'ai créé un projet factice, et j'utilise IObject dans un assemblage séparé, et ce code dans un autre. Tout compile bien. Je soupçonne fortement qu'il y a un problème différent qui cause ce problème. Avez-vous confirmé en vous assurant que les références à IObject ne sont pas récupérées d'un autre endroit à partir de la mise en œuvre dont vous avez besoin. –

+0

Quel est le rapport d'erreur pour "Type" et comment "/ * quelquechose * /" est-il défini? Ces deux questions sont essentielles pour vous répondre correctement ... –

+0

pourrait-il être le GAC? – kenny

Répondre

2

L'erreur est quelque peu cohérente avec l'erreur que vous obtenez lorsque vous référencez un assembly qui utilise un type défini dans un autre assembly et que vous ne référencez pas la dépendance de la dépendance.

Pour résoudre ce problème, ajoutez une référence à l'ensemble contenant IObject en référence au projet contenant Implementation.

Voici un petit diagramme. Si Assembly2 expose un type défini dans Assembly3, ASsembly1 doit également faire référence à Assembly3.La situation ci-dessous ne fonctionnera pas:

_____________    _____________    _____________ 
| Assembly1 |references | Assembly2 |references | Assembly3 | 
|   -|------------|->   -|--------------|->   | 
|   |   | public  |    | IObject | 
|   |   | IObject |    |   | 
|   |   |   |    |   | 
-------------    -------------    ------------- 

Ceci est uniquement un problème lorsqu'un type défini dans Assembly3 est accessible via Assembly2. Cela se produit dans l'une des situations suivantes:

  • Le type défini dans Assembly2 provient d'un type dans Assembly3.
  • La méthode définie dans Assembly2 utilise un type de Assembly3 comme type de retour ou comme argument.
  • Le type défini dans Assembly2 expose un type à Assembly3 en tant que propriété ou champ public.

Vous devrez ajouter une référence à Assembly3 à partir de Assembly1 pour le compiler.

_____________    _____________    _____________ 
| Assembly1 |references | Assembly2 |references | Assembly3 | 
|   -|------------|->   -|--------------|->   | 
|   |   | public  |    | IObject | 
|   |references | IObject |    |   | 
|   -|------------|------------|--------------|->   | 
|   |   |   |    |   | 
-------------    -------------    ------------- 
+0

+1 - Explication plus détaillée que ma version. – Toby