Dienstag, Februar 18, 2020

Error CS0117: Namespace.Eine enthält keine definition für das Interface

Ich bin immer der Fehler:


‚- Namespace.Ein “ enthält keine definition für ‚MyObjectInterface‘ und keine Erweiterungsmethode ‚MyObjectInterface‘ die Annahme ein erstes argument vom Typ …


Habe ich mir angeschaut diese und diese und weder scheint zu gelten.

Der code sieht wie folgt aus:

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 definiert ist, in einer separaten assembly, aber:

    • IObject ist in einer separaten assembly/namespace
    • Basis und sind in der gleichen assembly/namespace mit jeweils richtige using-Direktiven
    • Umsetzung wird in einem Dritten separaten assembly, namespace, auch mit richtigen using-Direktiven.
  • Casting, bevor Sie versuchen, MyObjectInterface nicht funktioniert

  • Speziell, ich versuche, den Wert des MyObjectInterface, um ein mock-Objekt (obwohl, erstellte ich ein fake anstatt ohne Erfolg)

Ich habe versucht, alles, was ich denken kann. Bitte helfen Sie, bevor ich Sie verliere mehr Haare.

Bearbeiten
Ich kann den Fehler reproduzieren, indem Sie erstellen eine test-app, das ist, warum ich hier bin und warum ich bin frustriert.

@Reed Copsey: /* irgendwas */ist entweder ein NUnit.DynamicMock(IMailer).MockInstance oder ein Fake-Objekt, die ich erstellt, erbt von IObject und gibt einfach zurück, Konserven Werte.

@Preet Sangha: ich überprüft und keine andere Versammlung, auf das verwiesen wird, hat eine definition für ein IObject (speziell, es ist ein so genanntes IMailer).

Sache ist, dass intellisense greift das Eigentum, aber, wenn ich kompiliere, bekomme ich CS0117. Ich kann auch ‚Gehe Zu Definition“ in der Umsetzung, und es dauert mich, wo ich es definiert.

  • Ich habe ein dummy-Projekt, und mit IObject in separaten assembly, und dieser code in einen anderen. Alles ist Zusammenstellung in Ordnung. Ich vermute stark, es ist anderes Problem, das dieses problem verursacht. Haben Sie bestätigt, indem sichergestellt wird unter Verweise auf IObject nicht abgeholt, von einem anderen Ort aus der Umsetzung, die Sie benötigen.
  • Was ist die Meldung „Type“ und wie ist „/* irgendwas */“ definiert? Diese zwei Fragen sind entscheidend für die Beantwortung, die Sie richtig…
  • könnte es sein, das GAC?
InformationsquelleAutor Steven Evers | 2010-05-12

1 Kommentar

  1. 3

    Der Fehler ist eher im Einklang mit der Fehlermeldung, die Sie erhalten, wenn Sie verweisen auf eine assembly, ein Typ verwendet, der in einer anderen assembly definiert, und Sie werden nicht verweisen auf die Abhängigkeit ist Abhängigkeit.

    Dies zu beheben, fügen Sie einen Verweis auf die assembly mit IObject als einen Verweis auf das Projekt mit Implementation.

    Hier ist die kleine Diagramm. Wenn Assembly2 stellt eine Art definiert, die in Assembly3 dann ASsembly1 verweisen muss Assembly3 als gut. Die unter Lage wird nicht funktionieren:

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

    Dies ist nur ein Problem, wenn ein Typ definiert, in Assembly3 ist zugänglich durch Assembly2. Dies wird in einer der folgenden Situationen:

    • Definierten Typ in Assembly2 leitet sich von einem Typ in Assembly3.
    • Definierte Methode in Assembly2 ein Typ verwendet, der aus Assembly3 als Rückgabetyp oder als Parameter übergeben wird.
    • Definierten Typ in Assembly2 stellt eine Art von Assembly3 als eine Eigenschaft oder ein öffentliches Feld.

    Müssen Sie fügen Sie einen Verweis auf Assembly3 von Assembly1, um es zu kompilieren.

    _____________             _____________               _____________
    | Assembly1  |references  | Assembly2  |references    | Assembly3  |
    |           - | ------------ | ->         - | -------------- | ->          |
    |            |            | public     |              | IObject    |
    |            |references  |  IObject   |              |            |
    |           - | ------------ | ------------ | -------------- | ->          |
    |            |            |            |              |            |
    -------------             -------------               -------------
    • +1 – ausführlichere Erklärung als meine version.

Kostenlose Online-Tests