我创建了一个单独的程序集来包含通用的扩展方法,这些扩展方法使用了
当我创建一个新的项目(控制台应用程序),引用包含扩展方法的
当我的某个扩展方法是泛型方法时,一切都按预期工作。但是,一旦我向泛型方法添加约束,将其限制为
换句话说,只要我的泛型方法没有约束,一切都可以编译,但是一旦我添加约束,编译器就会抱怨。
下面是我的扩展方法程序集的示例(编译为库
但问题仍然存在,为什么约束会成为问题,而类型Control已经被用作方法的参数。为什么命名空间是解决方案,当我已经在顶部使用了using指令。
System.Web.dll
(和其他类)中的类。当我创建一个新的项目(控制台应用程序),引用包含扩展方法的
Utilities.dll
程序集时,如果该项目没有使用扩展了System.Web.dll
程序集中的任何类(例如System.Web.UI.Control
),则不需要为该新项目添加对System.Web.dll
的引用。当我的某个扩展方法是泛型方法时,一切都按预期工作。但是,一旦我向泛型方法添加约束,将其限制为
System.Web.dll
程序集中的一个类,编译器就会抱怨我的新项目(控制台应用程序)需要引用System.Web.dll
,即使该新项目仍然没有使用该程序集中的任何内容。换句话说,只要我的泛型方法没有约束,一切都可以编译,但是一旦我添加约束,编译器就会抱怨。
下面是我的扩展方法程序集的示例(编译为库
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();
}
}
以下是一个新的控制台应用程序,如果我不添加对 System.Web.dll
的引用,它将无法编译:
static void Main(string[] args)
{
bool isEmpty = "Hello World!".IsNullOrEmpty();
Console.ReadLine();
}
更新:
正如Marc在下面指出的那样,将有问题的方法放在单独的命名空间中可以解决这个问题。但问题仍然存在,为什么约束会成为问题,而类型Control已经被用作方法的参数。为什么命名空间是解决方案,当我已经在顶部使用了using指令。