重要类的通用类型约束

时间:2015-09-16 09:26:40

标签: c# generics

是否可以为不共享基类/接口的多个类定义泛型约束?

对于前。

class A
{
}

class B
{
}

class C
{
    void Test<T>(T someObj)
    {
        ...
    }
}

我想将A类或B类传递给Test方法,没有别的。

我知道我可以在A或B的基类/接口中放置一个where语句,但我不能在我的情况下为相关类指定基接口/类。

3 个答案:

答案 0 :(得分:5)

不,这样做没有意义。它不再是通用的。如果类AB共享属性,方法等,它们应该共享相同的接口或基类。如果没有,它们就不是“相同”,也不能被视为同样的。

猜猜如果您在两个类之一中更改了方法签名会发生什么。突然间,这种方法不再“共享”了。编译器不会尝试确定哪些方法和属性可以被视为共享,而是不支持您请求的功能。

一个选项是使用两个方法(每种类型的一个重载)引入​​重复代码,当然这很糟糕。最好使用interface,或者如果它真的不在你手中dynamic,尽管我尽量减少它的使用。

答案 1 :(得分:1)

在编译时不可能。

如果是,您将如何使用通用参数类型T?它的行为是A还是B

请考虑以下事项:

class A
{
    public void MethodInA();
}

class B
{
     public void MethodInB();
}

class C
{
    // pseudocode here!
    void Test<T>(T someObj) where T : A or B
    {
        // how it would behave if T is B?
        someObj.MethodInA();
        // how it would behave if T is A?
        someObj.MethodInB();
    }
}

而是提取一些基类或接口,这对于AB类都是通用的,并在通用方法约束中使用它。

答案 2 :(得分:1)

如果没有共享,那么:

void Test(A obj) {}
void Test(B obj) {}

是唯一真正的方法。你可以将泛型方法设为私有,并将重载设置为public,并从重载中调用私有方法,如:

private void TestImplementation<T>(T object) { ... }
public void Test(A obj) { this.TestImplementation(obj); }
public void Test(B obj) { this.TestImplementation(obj); }