lib1.dllアセンブリにClass1.GetChild<T>() where T : DependencyObject
拡張メソッドを作成しました。その後、lib1.dllに依存するすべてのアセンブリが次のエラーでコンパイルに失敗しました。
タイプ 'System.Windows.DependencyObject' は、参照されていないアセンブリで定義されています。アセンブリ「WindowsBase」などへの参照を追加する必要があります...
依存アセンブリが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
->コンパイルOK
A, B, //C
->コンパイルOK
//A, B, C
->コンパイルOK
A, //B, C
-> エラーを上げる
A, B, C
-> エラーを上げる
//A
意味methodA
がコメントされています。Damien が指摘したように、型推論は何らかの役割を果たす可能性があります。内外を知りたいと思っています。