Ну, для меня ясно, что название моего вопроса слишком сложное.Я просто попытался сделать это как можно более конкретным.Итак, я попытаюсь объяснить проблему лучше.
Контекст проблемы
Предположим, у нас есть три проекта .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, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null".C: \ Projects \ Test \ ApplicationAssembly \ Program.cs 22 13 ApplicationAssembly
Вопрос
Может кто-нибудь помочь мне понять, почему это так?
PS
Я сделал крошечное решение для расследования. Если вы любезно поможете мне, вы сможете взять архивное решение здесь
PPS
Извините за мой плохой английский.
UPD1
Еще одна странная вещь заключается в том, что различные вызовы метода 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);