2013-12-08 3 views
1

В проекте, над которым я работал в последние месяцы, я встретил странную проблему. В решении у меня есть три проекта: проект C, проект B, который ссылается на C и проект A, который ссылается на B. В проекте B я написал вспомогательный статический класс, который содержит несколько общих статических методов. Это выглядит примерно так:.зависимости от общих статических методов

public static class Foo 
{ 
    public static void DoStuff(T param) where T : ClassFromAssemblyC // It's ofcs some typical class which is defined in assemblyC 

    public static int SomeOrdinaryNonGenericMethod() 
    { 
     return 0; 
    } 
} 

Тогда, когда я пытался построить решение, которое я получил ошибку в проекте A с сообщением «Ошибка 3 Тип„ClassFromAssemblyC“определяется в сборке, которая не ссылается Вас должен добавить ссылку на сборку 'projectC, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'. "

я смог воспроизвести эту проблему в тестовом проекте с одним изменением, я должен использовать в проекте Один из , не общего метода класса, который содержит общий метод (со ссылкой на пример я использовал SomeOrdinaryNonGenericMethod(). Когда я «м изменяя определение метода DoStuff выглядеть государственных статической силой DoStuff (ClassFromAssemblyC пары) все строит правильно Кроме того, когда я меняюсь модификатор доступа FOM общественности к частному все работает нормально Вообще у меня есть два вопроса:..

  1. Почему генерические статические методы сломались, даже если они не используются

  2. Возможна ли другая ситуация, когда общий метод принуждал проект A ссылаться на Project C, даже если какой-либо член или метод класса, который содержит этот метод, не используются.

Update:

Я нашел описание подобной проблемы в шахте:

Mixing generic methods and extension methods

Подводя итог, я думаю, хороший ответ на то эти проблемы - цитата из этой темы: https://connect.microsoft.com/VisualStudio/feedback/details/668498/problem-with-extension-method-in-c-compiler

Как правило, компилятор C# не дает никаких обещаний, что ссылка на библиотеку потребует меньше, чем переходное закрытие собственных ссылок этой библиотеки. На практике компилятор будет пытаться загружать только метаданные, необходимые для привязки, и вы обычно уходите с гораздо меньшим подмножеством, но никаких гарантий нет. Решение в этих случаях заключается в том, чтобы добавить отсутствующую ссылку.

+0

Если * ваш код *, в некотором роде, форма или форма, возможно, потребуется понять типы из 'AssemblyC', тогда вам нужна ссылка.Это может быть из-за возможных перегрузок (даже если это не перегрузка, которую вы хотите использовать) или любого более общего разрешения типа (например, общие ограничения). –

+0

Спасибо за ответ, но мне все еще интересно, почему ошибка компиляции возникает только тогда, когда я использую один из методов класса Foo. – Marcin

ответ

0

На самом деле не имеет значения, используете ли вы этот метод или нет. Если публичный метод является каким-то образом с использованием типа unreferted. Есть (насколько я знаю), два сценария, где это может произойти:

  1. метод возвращает тип, который находится в неиспользуемые библиотеки
  2. Метод принимает тип, который находится в без ссылок библиотека
Смежные вопросы