views:

639

answers:

6

Hi, I was wondering if it is possible to add multiple generic constraints?

I have an Add method that takes an Object (Either Email, Phone or Address), so i was thinking something like:

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

But i keep getting "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."

+8  A: 

You can't do that. Why not just have three methods and let the compiler do the hard work for you?

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); }
Greg Beech
A: 

In that case, I wouldn't bother, as you are comparing types anyway. Use this:

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

I don't think multiple clauses are supported. You could also have separate method overloads too.

Lucas Jones
A: 

How about creating an interface or base class for those three types?

But looking at your code, seems that you're not using generic well enough. The point of using generic is that you don't need to cast it into any particular type (in this case, you are).

Adrian Godong
A: 

CLR does not allow multiple inheritance, which is precisely what you're trying to express. You want T to be Address, Email an Phone at the same time (I assume those are class names). Thus is impossible. What's event more, this whole method makes no sense. You'll either have to introduce a base interface for all three classes or use three overloads of an Add method.

Anton Gogolev
@Anton, I think the OP is asking about OR constraints (not AND).
bruno conde
+1  A: 

You don't get any real benefits from generics in this case. I would just create different Add methods for each parameter Type.

bruno conde
A: 

where T : C1, C2, C3. Comma separated for constraints. Try using Base class or interfaces.

Evan