Ich habe eine separate Assembly erstellt, die allgemeine Erweiterungsmethoden enthält. Die Erweiterungsmethoden verwenden Klassen aus System.Web.dll
(und anderen).Die Verwendung von eingeschränkten generischen Erweiterungsmethoden in einer separaten Assembly führt zu einem Referenzfehler.
Wenn ich ein neues Projekt (Konsole-Anwendung), dann erstellen, die die Utilities.dll
Assembly verweist, die die Erweiterungsmethoden enthalten, ich brauche nicht einen Verweis auf System.Web.dll
auf das neue Projekt hinzuzufügen, wenn es nicht die Erweiterungsmethoden nicht verwendet Das reicht jede Klasse in der System.Web.dll
Assembly (zum Beispiel System.Web.UI.Control
).
Wenn eine der Erweiterungsmethoden eine generische Methode ist, funktioniert alles wie erwartet. Aber sobald ich der generischen Methode eine Beschränkung hinzufüge, die sie auf eine Klasse in der System.Web.dll
Assembly beschränkt, wird der Compiler beschweren, dass mein neues Projekt (Konsolenanwendung) einen Verweis auf System.Web.dll
benötigt, obwohl das neue Projekt immer noch nichts verwendet diese Versammlung.
Mit anderen Worten, solange ich keine Einschränkung für meine generischen Methoden habe, kompiliert alles, aber sobald ich eine Bedingung hinzufüge, beschwert sich der Compiler.
static void Main(string[] args)
{
bool isEmpty = "Hello World!".IsNullOrEmpty();
Console.ReadLine();
}
Update::
Ein Beispiel für meine Erweiterungsmethoden assemble (als Bibliothek Utilities.dll
):
public static class StringExtensions
{
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
}
public static class ControlExtensions
{
// If I remove the where clause it compiles
public static T FildChild<T>(this Control parent, string id)
where T : Control
{
throw new NotImplementedException();
}
}
And here is a new console application that won't compile (unless I also add a reference to System.Web.dll
kompiliert) Wie Marc wies darauf hin, (unten) behebt die fehlerhafte Methode in einem separaten Namespace Puting die Problem.
verwende.Aber die Frage bleibt immer noch, warum die Einschränkung ein Problem ist, während der Typ Control
wurde bereits als Parameter für die Methode verwendet. und warum ist der Namespace die Lösung, wenn ich bereits oben die Anweisung
Ich bin mir nicht sicher, ob ich das vollständig verstehe. 1) Mein Projekt verwendet diesen Typ überhaupt nicht. 2) Die Erweiterungsmethode verwendet bereits diesen Typ im ersten Argument der Methode. Warum löst die Einschränkung diesen Wahnsinn aus? – Yona
Ich glaube nicht, dass dies die Frage beantwortet. Sein Code wird gut kompiliert, selbst wenn Control als Parametertyp referenziert wird, aber nicht, wenn er ihn als Einschränkung * zu derselben Methode * hinzufügt. Er verweist nicht einmal auf die Control-Erweiterungsklasse. –
Überraschenderweise legen Sie die problematische Methode in einem separaten Namespace (mit einem beliebigen Namen, solange es nicht mit den anderen Erweiterungen ist) das Problem behoben. Seltsamerweise. – Yona