2014-11-07 5 views
4

Я недавно столкнулся с ошибкой разрешения dependecy, которую я надеюсь, что кто-то здесь может объяснить.Любопытная ошибка разрешения зависимостей

У меня есть интерфейс, определенный в сборке 3rdparty (I3rdParty), одна «общая» сборка, которая зависит от этой сборки и «клиентская» библиотека, которая зависит от «общей» сборки. Назовем их, 3rdparty.dll, common.dll и client.dll.

Клиент.dll не должен иметь зависимость от файла 3rdparty.dll.

в common.dll следующих был определен:

public static class Factory 
{ 
    public static object Create(I3rdParty ifc) { ... } 
    public static object Create(string value1, string value2, long? value3 = null) { ... } 
} 

Одним из фабричных методов был использован из client.dll как:

var instance = Factory.Create("SomeValue", "SomeValue2"); 

На данный момент все работало, как ожидалось.

Тогда параметр BOOL был введен первый фабричный метод в common.dll поэтому он стал:

public static object Create(I3rdParty ifc, bool value) { ... } 

Затем сборка client.dll начал неудачу из-за отсутствующей зависимости к 3rdparty.dll, например, :

The type 'I3rdParty' is defined in an assembly that is not referenced... 

Я предполагаю, что это имеет какое-то отношение, что методы теперь принимает такое же количество параметров (начиная с третьего по умолчанию параметров на второй метод создания в нулевое значение).

Но я думал, что он все равно сможет выбрать правильный метод Create, основанный на типе параметров. Может ли кто-нибудь объяснить причину поведения, которое я вижу?

+1

Интересно. Вы испытываете ту же ошибку, если добавить 'Create (string)' (в состоянии, прежде чем вы добавили значение bool)? –

+0

С другой стороны, если ваш метод 'Create (I3rdParty)' никогда не предназначен для использования вашим 'client.dll', почему бы не сделать его' internal' вместо 'public'? –

+0

Да, но только если я должен был изменить client.dll, чтобы использовать этот метод Create. И да, в соответствии с приведенным выше примером, который, вероятно, был бы моим первым, хотя также :) В реальном сценарии, где я столкнулся с этим, оба метода создания были внутренними, а InternalsVisibleTo был установлен в client.dll, но я чувствовал это было к тому же вопросом. Код, приведенный выше, является упрощенным изолированным воспроизведением ошибки. Решение ошибки компилятора не является проблемой, просто надеялось, что кто-то сможет объяснить поведение. – Matsande

ответ

1

После добавлен параметр bool к первой перегрузки, компилятор должен теперь проверить для двух возможных сигнатур методов, чтобы выбрать тот, который должен быть использован (это разрешениеперегрузки).

Вы звоните Create(string, string)

С двумя параметрами, у вас есть следующие доступные перегрузки:

Create(I3rdParty, bool) 
Create(string, string) 

Очевидно только второй один может соответствовать (как string не может быть неявно преобразован в bool для второй параметр), но, похоже, компилятор недостаточно умен, а должен знать, что именно I3rdParty - (это означает, что для этого требуется ссылка на сборку, которая его определяет), прежде чем сможете определить ne (I3rdParty, bool) перегрузка не была вариантом.

+0

Звучит разумно, если я правильно понимаю, для обработки этого в общем случае компилятор нуждается в полной информации о типе всех параметров во всех возможных перегрузках, чтобы принять обоснованное решение, из-за неявных преобразований и еще чего-то. i.e: это то, что теоретически может быть обработано компилятором, но может оказаться непрактичным только для того, чтобы покрыть краевой регистр. – Matsande

Смежные вопросы