さて、私の質問のタイトルが複雑すぎることは私には明らかです。できるだけ具体的にしようと思いました。それで、私は問題をよりよく説明しようとします。
問題のコンテキスト
ソリューションに3つの.NETプロジェクトがあると仮定します。メインプロジェクトは、単純なコンソールアプリケーションApplicationAssemblyです。このプロジェクトには、別のマネージアセンブリライブラリDirectlyReferencedLibraryへの参照があります。同時に、DirectlyReferencedLibraryはIndirectlyUsedLibraryを参照します。
したがって、プロジェクトの使用法は次のようになります。ApplicationAssembly- >DirectlyReferencedLibrary->IndirectlyUsedLibrary。
ApplicationAssemblyは、IndirectlyUsedLibraryとして宣言されたタイプを直接使用しないことに注意してください。また、これらのアセンブリで宣言されたすべてのタイプが同じ名前空間にあると仮定しましょう。
このソリューションはコンパイルされ、正常に動作します。
奇妙な問題
次の条件を一緒にすると、問題が発生します。
- ApplicationAssemblyプロジェクトには、LINQ式の使用法があります。たとえば、列挙可能なタイプのオブジェクトに対してSelect()が呼び出された場合です。
- DirectlyReferencedLibraryは、型制限のあるジェネリック拡張メソッドを持つクラスを宣言します。型の制限により、ジェネリック型はIndirectlyUsedLibraryのクラスの子孫である必要があります。
このようなクラスの例を次に示します。
using System;
namespace Test
{
public static class UnUsedType
{
// It's a generic extension method with a type restriction.
public static void Magic<T>(this T @this)
// It's a type restriction that uses a type from the IndirectlyUsedLibrary.
where T : ProblemType
{
Console.WriteLine("I do nothing actually.");
}
}
}
このプロジェクトをコンパイルしようとすると、次のエラーが発生します。
エラータイプ'Test.ProblemType'は、参照されていないアセンブリで定義されています。アセンブリ'IndirectlyUsedLibrary、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'への参照を追加する必要があります。C:\ Projects \ Test \ ApplicationAssembly \ Program.cs 22 13 ApplicationAssembly
質問
なぜそうなのか、誰かが私に理解するのを手伝ってもらえますか?
PS
私は調査のための小さな解決策を作りました。あなたが私を助けてくれてとても親切なら、あなたはここでアーカイブされた解決策を取ることができるでしょう
PPS
英語が下手でごめんなさい。
UPD1
もう1つの奇妙なことは、LINQメソッドの呼び出しが異なると、コンパイル時エラーが発生する場合と発生しない場合があることです。
// Ok. Let's do some work using LINQ we love so much!
var strings = new[] { "aaa", "bbb", "ccc" };
Func<string, object> converter = item => (object) item;
// The following line makes problems.
var asObjects1 = strings.Select(converter);
// Everything is OK if we use the following line:
var asObjects2 = Enumerable.Select(strings, converter);