我创建了一个单独的程序集来包含常见的扩展方法,扩展方法使用来自System.Web.dll
(和其他)的类。
然后,当我创建一个引用包含扩展方法的程序集的新项目(控制台应用程序)时,如果它不使用扩展程序集中任何类Utilities.dll
的扩展方法,我不需要添加对新项目的引用(例如)。System.Web.dll
System.Web.dll
System.Web.UI.Control
当其中一种扩展方法成为通用方法时,一切都会按预期继续工作。但是,一旦我将约束添加到将其约束到程序集中的类的通用方法中,System.Web.dll
编译器就会抱怨我的新项目(控制台应用程序)需要引用,System.Web.dll
即使新项目仍然没有使用该程序集中的任何内容.
换句话说,只要我对我的泛型方法没有约束,一切都会编译,但只要我添加约束,编译器就会抱怨。
我的扩展方法 assemble 的一个示例(编译为库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
):
static void Main(string[] args)
{
bool isEmpty = "Hello World!".IsNullOrEmpty();
Console.ReadLine();
}
Update:
As Marc pointed out (below) puting the offending method in a separate namespace fixes the problem.
顶部的指令。But the question still remains why is the constraint a problem while the type Control
was already used as a parameter to the method. and why is the namespace the solution when I already use the using