Вдохновленный Phil Haack's attempt on null or empty coalescing, я пытаюсь написать пару методов расширения для объекта string
, а также на интерфейсе IEnumerable<T>
, чтобы упростить нулевое или emtpy ckecking. Тем не менее, у меня возникают проблемы: когда я пытаюсь вызвать string
версию AsNullIsEmpty
, компилятор обрабатывает мою строку как IEnumerable<char>
и, конечно же, дает неправильный тип возврата.Анти-ограничение на генераторы C#
Есть ли способ, чтобы положить «анти-ограничение» по определению версии IEnumerable
, так что я могу сказать компилятору использовать, что один всякий раз, когда тип T
является неstring
? Что-то вроде
public static IEnumerable<T> AsNullIfEmpty(this IEnumerable<T> items)
where T !: string
Я знаю, что я мог бы просто изменить название одного из них, но я хочу иметь такое же имя для последовательности.
Update: Оказывается, моя проблема с методами расширения была решена другим способом, путем фиксации простой и глупой ошибки (я использую str.IsNullOrEmpty()
, метод расширения на IEnumerable<T>
, вместо string.IsNullOrEmpty(str)
...), но так как вопрос об анти-ограничениях на дженериках остается интересным, я не буду его удалять.
Компилятор Выберет наиболее подходящий метод. Если вы реализуете одну строку и убедитесь, что она доступна на сайте Call, у вас не будет проблем, подобных описанному –