Ну, мне ясно, что название моего вопроса слишком сложное. Я просто попытался сделать это как можно более конкретным. Итак, я постараюсь объяснить проблему лучше.
Контекст проблемы
Предположим, у нас есть три проекта .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, культура = нейтральная, PublicKeyToken = null». C:\Projects\Test\ApplicationAssembly\Program.cs 22 13 ApplicationAssembly
Вопрос
Может ли кто-нибудь помочь мне понять, почему это так?
P.S.
Я сделал крошечное решение для исследования. Если вы так любезны помочь мне, вы сможете взять заархивированное решение здесь
P.P.S.
Извините за мой плохой английский.
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);
IndirectlyUsedLibrary
в проектApplicationAssembly
- person L.B   schedule 22.12.2011Test.Magic
. - person BrainStorm.exe   schedule 23.05.2016