Warum ich (manchmal) zu Referenz-Assemblys verwiesen wird, die von der Versammlung auf die ich mich beziehe?

Habe ich eine Versammlung Ein, die definiert eine Schnittstelle mit einigen überladungen:

public interface ITransform
{
    Point InverseTransform(Point point);
    Rect InverseTransform(Rect value);
    System.Drawing.Point InverseTransform(System.Drawing.Point point);
}

...und eine Baugruppe B, die auf Eine (die binären, nicht das Projekt), und ruft eine der überladungen:

var transform =
    (other.Source.TransformToDisplay != null &&
    other.Source.TransformToDisplay.Valid) ?
    other.Source.TransformToDisplay : null;
if (transform != null)
{
    e.Location = transform.InverseTransform(e.Location);
}

Um genau zu sein, es ruft die System.Windows.Point überlastung der InverseTransform Methode, denn das ist der Typ der Eigenschaft Location im e.

Aber wenn ich bauen B in der IDE bekomme ich:

Fehler CS0012: Der Typ 'System.Zeichnung.Punkt' defined in an assembly that is not referenced. Müssen Sie fügen Sie einen Verweis auf die assembly " System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".

obwohl das auch nicht die überlastung rufe ich. Wenn ich den Kommentar aus der Zeile, wo die überladene Methode InverseTransform heißt, es baut feines, obwohl ich bin immer noch der Instanziierung ein Objekt vom Typ ITransform.

Warum? Und gibt es eine Möglichkeit dieses Problem zu beheben, ohne dass Sie einen Verweis auf System.Drawing überall?

  • Aus Neugier, könnten Sie benennen Sie die Letzte überladung InverseTransform2 und versuchen Sie es erneut? Ich kenne die Antwort nicht, aber ich Frage mich, wenn es nichts zu tun hat mit überlast-Auflösung.
  • Ist e.Location speziell ein System.Windows.Point Objekt, oder einer anderen Klasse abgeleitet aus System.Windows.Point?
  • ja, es hat zu tun mit überlast-Auflösung, die mit anderen Methodennamen löst es aber ich will nicht zu ändern Sie die Schnittstelle
  • Morgan: e.Lage ist ein System.Windows.Punkt, und selbst wenn es abgeleitet, dass es immer eine System.Windows.Punkt und nie ein System.Zeichnung.Punkt
  • Es kann von Bedeutung für den compiler; siehe mein Kommentar auf Slaks Antwort. Da der compiler nicht weiß, was ein System.Drawing.Point ist, weiß er nicht, was überlastung ist die spezifische e.Location. Angenommen System.Drawing.Point ist eine Schnittstelle, und e.Location ist eine abgeleitete Klasse, die diese Schnittstelle implementiert? Damit wäre die zweite überladung der richtige verwenden. Funktioniert der compiler wissen, dass e.Location wird immer ein System.Windows.Point?
InformationsquelleAutor mtijn | 2012-04-18
Schreibe einen Kommentar