我们可以将类型限制为委托

时间:2010-11-12 02:26:00

标签: c# .net

我们可以将类型限制为类或结构。我们可以将类型严格定义为委托吗?

2 个答案:

答案 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.
}