C# Multiple generic constraints

久未见 提交于 2019-11-29 03:02:59

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

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.

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).

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

Like others have said, in your specific case you should use inheritance or method overloading instead of generics. However, if you do need to create a generic method with multiple constraints then you can do it like this.

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

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.

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!