Подтвердить что ты не робот

Неоднозначный метод расширения

Я делаю следующий вызов метода расширения:

database.ExecuteScalar(command).NoNull<string>(string.Empty);

Я получаю сообщение об ошибке, что метод расширения неоднозначен.

У меня есть две библиотеки DLL с тем же кодом, которые реализуют NoNull(string str) под разными пространствами имен.

Как я могу явно ссылаться на одно пространство имен?

Как бы это сделать, если это одно и то же пространство имен?

Обновление: я не могу перезаписать сторонние DLL.

4b9b3361

Ответ 1

  • Удалите двусмысленность путем переопределения или устранения одного из методов в источнике. Вам не требуется избыточность.
  • Если вы не контролируете источник, включите только один из них в свой файл класса с помощью директивы using.
  • Если вам все еще нужны оба пространства имен в данном файле класса, вызовите версию, которую вы хотите просто как вызов статического класса, однозначно определяя метод с помощью полного имени класса.

-

 Abc.Xyz.ExtensionsClass.NoNull(database.ExecuteScalar(), string.Empty);

Ответ 2

На всякий случай кому-то это понадобится...

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

Например:

using Namespace1;
namespace MyApplication 
{
    using Namespace2;
    ...
    db.Execute(); // Namespace2 Execute() will be called
}

Ответ 3

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

Ответ 4

Вы должны изменить подпись одного (или обоих из них), чтобы отличить то, что он делает. Это похоже на дублирование кода где-нибудь, если они не делают разные вещи. Хотя, если они будут делать разные вещи, я думаю, вы бы разделили это на имена. Я бы рекомендовал создать какое-то перечисление (возможно, флаг) для передачи в качестве дополнительного аргумента одному из методов.