我有通用方法。我想要通用方法来限制一种类型。问题是派生类型不被允许-我不想要这个。示例代码:

public static T Generate<T>(T input)
    where T : Operation // ALLOWS BinaryOperation - NOT WANT THIS
{
    //...
}


我该怎么办?

最佳答案

问题是不允许的派生类型


如果不在运行时检查约束,则无法强制实施此约束。这样做会违反Liskov Substitution Principle,它指出任何类型都应允许您不受限制地传入派生类型。

如果必须执行此操作,则它仅适用于运行时检查,例如:

public static T Generate<T>(T input)
    where T : Operation // ALLOWS BinaryOperation - NOT WANT THIS
{
    // Checks to see if it is "Operation" (and not derived type)
    if (input.GetType() != typeof(Operation))
    {
        // Handle bad case here...
    }

    // Alternatively, if you only want to not allow "BinaryOperation", you can do:
    if (input is BinaryOperation)
    {
        // Handle "bad" case of a BinaryOperation passed in here...
    }
}


请注意,在这种情况下,实际上没有理由使它通用,因为相同的代码可以这样工作:

public static Operation Generate(Operation input)
{ // ...

08-17 16:06