我们可以将类型限制为类或结构。我们可以将类型严格定义为委托吗?
答案 0 :(得分:9)
Delegate
是一个类,您通常可以将非密封类指定为约束。但是,语言规范明确地将System.Delegate
排除在10.1.5节中作为有效约束。
class-type 约束必须满足 以下规则:
- 类型必须是类类型。
- 不得密封该类型。
- 该类型不能是以下类型之一:System.Array, System.Delegate,System.Enum或 System.ValueType。强>
- 类型不能是对象。因为所有类型都来自对象, 这样的约束无效 如果允许的话。
- 给定类型参数的最多一个约束可以是类类型。
答案 1 :(得分:2)
正如已经指出的那样,C#规范不允许Delegate
通用约束。编译器也不接受Delegate
子类作为通用约束。你能做的最好的就是测试并抛出异常。我将使用一个方法来显示它,但如果这是一个泛型类,构造函数将是一个检查的好地方。
public void Foo<T>(T x)
{
if (x == null)
throw new ArgumentNullException("x");
Delegate d = x as Delegate;
if (d == null)
throw new ArgumentException("Argument must be of Delegate type.", "x");
// Use d here.
}