C#多个通用约束

时间:2009-07-24 10:49:12

标签: c# constraints generics

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

我有一个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."

7 个答案:

答案 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同时为AddressEmailPhone(我假设这些是类名)。因此是不可能的。更重要的是,整个方法毫无意义。您要么必须为所有三个类引入基本接口,要么使用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类或接口。