C# - 为什么要设置接口通用约束而不是仅传递接口类型?

时间:2015-09-12 23:23:32

标签: c# generics

我找到了很多像这样的代码:

public interface IFoo
{
   void DoSomething();
}

public void RegisterFoos<T>(T foo) where T : IFoo
{
    foo.DoSomething();
}

我没有得到这种代码,为什么不通过IFoo?

2 个答案:

答案 0 :(得分:3)

我至少可以看到两个原因。

一个原因是允许发送特定类型的引用。作为接口,您可以发送相同的对象,但是您只能使用foo.GetType()来获取类型,但这是对象的实际类型。通过使用泛型类型,您可以将对象强制转换为其他类型,typeof(T)获取该类型。

另一个原因是能够返回与参数相同类型的引用。例如:

public T DoSomething<T>(T foo) where T : IFoo {
  foo.DoSomething();
  return foo;
}

答案 1 :(得分:1)

通过使用通用约束,您可以获得更大的灵活性。

考虑:

public class Foo:IFoo
{
    public void DoSomething() // from interface
    {
    }

    public void DoSomethingWithFoo() // custom method
    {
    }
}

现在该方法的两个版本:

public void RegisterFoosGeneric<T>(T item, Action<T> action) where T : IFoo
{
    action(item);
}

public void RegisterFoos(IFoo item, Action<IFoo> action)
{
    action(item);
}

此行有效:

test.RegisterFoosGeneric(new Foo(), x=>x.DoSomethingWithFoo());

这个不是,给出了编译错误:

test.RegisterFoos(new Foo1(), x=>x.DoSomethingWithFoo1());