我想知道是否可以添加多个通用约束?
我有一个Add方法,它接受一个Object(电子邮件,电话或地址),所以我想的是:
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."
答案 0 :(得分:25)
你做不到。为什么不只是有三种方法让编译器为你努力工作?
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); }
答案 1 :(得分:9)
CLR不允许多重继承,这正是您要表达的内容。您希望T
同时为Address
,Email
和Phone
(我假设这些是类名)。因此是不可能的。更重要的是,整个方法毫无意义。您要么必须为所有三个类引入基本接口,要么使用Add
方法的三个重载。
答案 2 :(得分:5)
如何为这三种类型创建接口或基类?
但是看看你的代码,似乎你没有足够好地使用通用。使用泛型的关键是你不需要将它强制转换为任何特定的类型(在这种情况下,你是)。
答案 3 :(得分:2)
在这种情况下,您不会从泛型中获得任何实际好处。我只想为每个参数Type创建不同的Add方法。
答案 4 :(得分:2)
就像其他人所说的那样,在您的特定情况下,您应该使用继承或方法重载而不是泛型。但是,如果您确实需要创建具有多个约束的泛型方法,那么您可以这样做。
public void Foo<T>() where T : Bar, IBaz, new()
{
// Your code here
}
答案 5 :(得分:1)
在这种情况下,我不会打扰,因为你正在比较类型。使用此:
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 :(得分:-4)
其中T:C1,C2,C3。 以逗号分隔约束。尝试使用Base类或接口。