C#多个通用约束

我想知道是否可以添加多个通用约束?

我有一个Add方法,它接受一个Object(电子邮件,电话或地址),所以我想的是:

public void Add(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."

你不能这样做。 为什么不只是有三种方法让编译器为你努力工作?

 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不允许多重inheritance,这正是您要表达的内容。 您希望T同时为AddressEmail发送Phone (我假设这些是类名)。 因此是不可能的。 更重要的是,整个方法毫无意义。 您要么必须为所有三个类引入基接口,要么使用Add方法的三个重载。

如何为这三种类型创建接口或基类?

但是看看你的代码,似乎你没有足够好地使用通用。 使用generics的关键是你不需要将它转换为任何特定的类型(在这种情况下,你是)。

在这种情况下,您不会从generics中获得任何实际好处。 我只想为每个参数Type创建不同的Add方法。

在那种情况下,我不会打扰,因为你正在比较类型。 用这个:

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

我不认为支持多个条款。 您也可以使用单独的方法重载。

像其他人所说,在你的特定情况下,你应该使用inheritance或方法重载而不是泛​​型。 但是,如果您确实需要创建具有多个约束的generics方法,那么您可以这样做。

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

其中T:C1,C2,C3。 以逗号分隔约束。 尝试使用Base类或接口。