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

С# Несколько общих ограничений

Мне было интересно, можно ли добавить несколько общих ограничений?

У меня есть метод Add, который принимает объект (E Email, Phone или Address), поэтому я думал что-то вроде:

public void Add<T>(T Obj) 
    where T : Address
    where T : Email
    where T : Phone
{
    if (Obj is Address)
        m_Address.Add(Obj as Address);
    else if (Obj is Email)
        m_Email.Add(Obj as Email);
    else
        m_Phone.Add(Obj as Phone);
}

Но я продолжаю получать:

"A constraint clause has already been specified for type parameter 'T'. All of the constraints for a type parameter must be specified in a single where clause."

4b9b3361

Ответ 1

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

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); }

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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;
}

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

Ответ 6

Как и другие, в вашем конкретном случае вы должны использовать наследование или перегрузку метода вместо дженериков. Однако, если вам нужно создать общий метод с несколькими ограничениями, вы можете сделать это следующим образом.

public void Foo<T>() where T : Bar, IBaz, new()
{
    // Your code here
}

Ответ 7

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