C# Несколько универсальных ограничений

Отличный ответ, спасибо. Небольшое улучшение для поддержки Windows Phone и Zune:

if (navigator.userAgent.match(/Android/i) ||
  navigator.userAgent.match(/webOS/i) ||
  navigator.userAgent.match(/iPhone/i) ||
  navigator.userAgent.match(/iPad/i) ||
  navigator.userAgent.match(/iPod/i) ||
  navigator.userAgent.match(/BlackBerry/) ||
  navigator.userAgent.match(/Windows Phone/i) ||
  navigator.userAgent.match(/ZuneWP7/i)
) {
  // some code
  self.location = "top.htm";
}
22
задан Glauco Vinicius 19 February 2013 в 20:16
поделиться

6 ответов

Вы не можете этого сделать. Почему бы просто не иметь три метода и не позволить компилятору сделать тяжелую работу за вас?

public void Add(Address address) { m_Address.Add(address); }
public void Add(Email email) { m_Email.Add(email); }
public void Add(Phone phone) { m_Phone.Add(phone); }
25
ответ дан 29 November 2019 в 04:47
поделиться

CLR не допускает множественное наследование, что вы и пытаетесь выразить. Вы хотите, чтобы T был одновременно адресом , электронной почтой и телефоном (я предполагаю, что это имена классов). Таким образом невозможно. Более того, весь этот метод не имеет смысла. Вам придется либо ввести базовый интерфейс для всех трех классов, либо использовать три перегрузки метода Add .

9
ответ дан 29 November 2019 в 04:47
поделиться

Как насчет создания интерфейса или базового класса для этих трех типов?

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

5
ответ дан 29 November 2019 в 04:47
поделиться

В этом случае вы не получите никакой реальной пользы от дженериков. Я бы просто создал разные методы добавления для каждого типа параметра.

2
ответ дан 29 November 2019 в 04:47
поделиться

В этом случае, Я бы не стал заморачиваться, так как вы все равно сравниваете типы. Используйте это:

public void Add(object Obj)
{
    if (Obj is Address)
        m_Address.Add(Obj as Address);
    else if (Obj is Email)
        m_Email.Add(Obj as Email);
    else if (Obj is Phone)
        m_Phone.Add(Obj as Phone);
    else
        return;
}

Я не думаю, что поддерживаются несколько предложений. У вас также могут быть отдельные перегрузки методов.

Не думаю, что поддерживаются несколько предложений. У вас также могут быть отдельные перегрузки методов.

Не думаю, что поддерживаются несколько предложений. У вас также могут быть отдельные перегрузки методов.

1
ответ дан 29 November 2019 в 04:47
поделиться

где T : C1, C2, C3. Запятая разделена для ограничений. Попробуйте использовать базовый класс или интерфейсы.

-4
ответ дан 29 November 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: