2010-07-15 2 views
3

Вдохновленный 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) ...), но так как вопрос об анти-ограничениях на дженериках остается интересным, я не буду его удалять.

+0

Компилятор Выберет наиболее подходящий метод. Если вы реализуете одну строку и убедитесь, что она доступна на сайте Call, у вас не будет проблем, подобных описанному –

ответ

8

Единственный способ сделать это - создать перегрузку этого расширения, которое принимает string как его параметр this.

public static string AsNullIfEmpty(this string value) 

Выполнение этого приведет к тому, что специально типизированная версия будет считаться лучшим соответствием перегрузки, чем общая версия.

Что касается вашего конкретного вопроса («Могу ли я указать« анти-ограничение »для параметра общего типа?»), Ответ будет отрицательным. Вы можете получить очень близко, хотя, с атрибутом Obsolete.

[Obsolete("AsNullIfEmpty is not supported for strings.", true)] 
public static string AsNullIfEmpty(this string value) 

Это приведет к тому, что компилятор сообщит об ошибке для этой перегрузки.

+0

. Это то, что у меня было - и, как вы видите в моем обновлении, проблема метода расширения решена. (Проблема возникла из-за другой ошибки ...). Однако есть ли способ указать анти-ограничения? –

+0

Тогда, когда T является строкой, вы получаете красивую intellisense из 2 методов с идентичными сигнатурами. –

+0

@ Томас: Есть простой ответ на этот вопрос: Нет, нет способа указать анти-ограничения. – LukeH

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