是否可以使参数实现两个接口?

是否可以定义一个接受必须实现两个接口的参数的函数?

(这两个接口是我刚想起的那个接口;不是我想要使用的接口)

private void DoSomthing(IComparable, ICollection input) { } 

您可以:

1)定义一个inheritance所需接口的接口:

 public interface ICombinedInterface : IComparable, ICollection {... } private void DoSomething(ICombinedInterface input) {... } 

2)使用generics:

 private void DoSomething(T input) where T : IComparable, ICollection {...} 

您可以从这两个接口inheritance另一个接口,并使您的参数实现该接口。

嗯,是的,不。

正如Steve建议的那样,您可以创建另一个第三个接口,该接口从您想要的两个接口开始,并将其用于参数类型。

但是,这也要求所使用的类也实现第三个接口。

换句话说,这不起作用:

 public interface I1 { } public interface I2 { } public class C : I1, I2 { } public interface I3 : I1, I2 { } public class YourClass { public void Test(I3 i) { } } ... YourClass yc = new YourClass(); C c = new C(); yc.Test(c); // won't work, C does not implement I3 

但是,您可以通过generics来欺骗编译器。

 public class YourClass { public void Test(T i) where T: I1, I2 { } } 

现在它会起作用。 我仍然不是百分百肯定不会给你其他问题,我必须考虑一下。

上面提到的generics函数方法是一个很好的方法,有一个重要的注意事项:为了对一个对象进行类型转换以便它可以传递给具有多个generics约束的例程,必须知道满足这些约束的类型并且是父类型正在施放的物体 接受这样一个对象的例程将知道这样一个类型(它作为generics类型参数传入)但是类没有很好的方法来保存这些信息并在以后使用它。 如果各种不相关的类型同时实现IFoo和IBar,那么很难设计一个例程,它可以接受许多不相关的对象实例,将它们存储在列表或其他东西中,然后将列表中的所有项目传递给例程使用通用的IFoo + IBar参数。

如果这样的场景可能是必要的,那么最好的方法是为每个通用例程设置一个非generics对应物,它将接受例如IFoo类型的参数并根据需要将其投射到IBar。 然后可以将所有项目存储在List 中并将它们传递给例程。 人们会失去通用方法的类型安全性,但有时候无法实现完美的类型安全性。