我找到了很多像这样的代码:
public interface IFoo
{
void DoSomething();
}
public void RegisterFoos<T>(T foo) where T : IFoo
{
foo.DoSomething();
}
我没有得到这种代码,为什么不通过IFoo?
答案 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());