今天看到这个签名:
public interface ISomeInterface<in T>
in
参数有什么影响?
答案 0 :(得分:43)
您可以阅读.NET 4.0中引入的通用variance and contravariance。 in
关键字对接口的影响是它将其声明为逆变,这意味着T
只能用作输入方法类型。您不能在此接口的方法上将其用作返回类型。这样做的好处是你可以做这样的事情(如上所述):
interface IProcessor<in T>
{
void Process(IEnumerable<T> ts);
}
List<Giraffe> giraffes = new List<Giraffe> { new Giraffe() };
List<Whale> whales = new List<Whale> { new Whale() };
IProcessor<IAnimal> animalProc = new Processor<IAnimal>();
IProcessor<Giraffe> giraffeProcessor = animalProc;
IProcessor<Whale> whaleProcessor = animalProc;
giraffeProcessor.Process(giraffes);
whaleProcessor.Process(whales);
答案 1 :(得分:4)
这表示通用的逆转。相反的是协方差(关键字out
)。
这意味着当接口是逆变的(in
)时,当type参数继承T时,接口可以隐式转换为泛型类型。
相反,对于协方差out
,接口可以隐式转换为泛型类型,其中类型参数是类型层次结构中的“较小”类型。