如何限制泛型函数只接受某种类型的类

dsb*_*dsb 3 c# generics

我正在尝试执行以下操作:

public class A
{
}

public class B
{
}
Run Code Online (Sandbox Code Playgroud)

在项目的某个地方我想要这个:

public class C
{
    public T func<T>(T obj) [where T can be either of class A or class B]
    {
        obj.x = 100;

        return obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直在努力:

public T func<T>(T obj) where T: A, B
Run Code Online (Sandbox Code Playgroud)

但这给了我:

类型类约束"B"必须在任何其他约束之前.

有人可以解释我如何func只接受A级或B级?

Joe*_*orn 5

正如在问题中所描述的那样,这项工作可以通过重载解析来更好地处理:

public class C
{
    public A func(A obj)
    {
        obj.x = 100;   
        return obj;
    }

    public B func(B obj)
    {
        obj.x = 100;   
        return obj;
    }

}
Run Code Online (Sandbox Code Playgroud)

但我知道A和B可能是任何类型的占位符,并且所有这些都可能变得乏味.在这种情况下,您需要一个由您的每个类支持的通用接口:

interface IBase
{
    int x;
}

public class C
{
    public IBase func(IBase obj)
    {
        obj.x = 100;   
        return obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此时我们仍然不需要泛型.此外,您可能需要支持许多类型,这些类型在通用接口下不能完全组合在一起.在这种情况下,仍然构建接口并尽可能多地使用该接口.如果需要,为更多类型构建另一个接口......依此类推......然后在接口和特定类型之间,您可以处理具有重载决策的事物.