我有通用方法。我想要通用方法来限制一种类型。问题是派生类型不被允许-我不想要这个。示例代码:
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)
{ // ...