问题
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."
回答1:
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); }
回答2:
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.
回答3:
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).
回答4:
You don't get any real benefits from generics in this case. I would just create different Add methods for each parameter Type.
回答5:
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
}
回答6:
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.
回答7:
where T : C1, C2, C3. Comma separated for constraints. Try using Base class or interfaces.
来源:https://stackoverflow.com/questions/1176908/c-sharp-multiple-generic-constraints