我在lib1.dllClass1.GetChild<T>() where T : DependencyObject
程序集中创建了扩展方法。之后,依赖lib1.dll的所有程序集都无法编译并出现错误:
'System.Windows.DependencyObject' 类型在未引用的程序集中定义。您必须添加对程序集“WindowsBase”等的引用...
为什么依赖程序集即使不使用也需要WindowsBaseGetChild
?
.
重现(vs2010 .net4):
lib1.dll(参考WindowsBase)
namespace lib1
{
public static class Class1
{
public static T GetChild<T>(this DependencyObject src) where T : DependencyObject
{
return default(T);
}
}
public static class Class2
{
public static int SomeExtMethod(this string src)
{
return 0;
}
}
}
lib2.dll(引用lib1但不引用WindowsBase)
using lib1;
class someClass
{
void someFct()
{
"foo".SomeExtMethod(); // error: The type 'System.Windows.DependencyObject'
// is defined in an assemebly that is not referenced.
// You must add a reference to assembly 'WindowsBase' etc..
}
}
.
更新:
我认为混合通用方法和扩展方法时肯定有一些东西。我试图在以下示例中演示该问题:
// lib0.dll
namespace lib0
{
public class Class0 { }
}
// lib1.dll
using lib0;
namespace lib1
{
public static class Class1
{
public static void methodA<T>() where T : Class0 { } // A
public static void methodB(Class0 e) { } // B
public static void methodC(this int src) { } // C
}
public static class Class2
{
public static void methodD(this String s) { }
}
}
// lib2.dll
using lib1;
class someClass
{
void someFct()
{
Class2.methodD(""); // always compile successfully
"".methodD(); // raise the 'must add reference to lib0' error depending on config. see details below.
}
}
A, //B, //C
-> 编译确定
A, B, //C
-> 编译确定
//A, B, C
-> 编译确定
A, //B, C
-> 引发错误
A, B, C
-> 引发错误
//A
手段methodA
被评论。正如 Damien 指出的那样,类型推断可能会发挥一些作用。仍然很想知道来龙去脉。