我无法理解为什么第二次实施时无法找到通用接口的扩展方法。
这是一个用来说明问题的人为例子。最初,这是有效的。我马上打破它:
public interface IContains<in TBeer, out TPack>
{
TPack Add(TBeer element);
}
public class Coors { }
public class Miller { }
public class SamplerPack : IContains<Coors, SamplerPack>
{
public SamplerPack Add(Coors element)
{
// logic removed for brevity
return this;
}
}
public static class Extension
{
public static TPack CoorsExtension<TPack>(this IContains<Coors, TPack> element)
{
// logic removed for brevity
return (TPack) element;
}
}
使用此设置,扩展方法CoorsExtension
有效:
如果我再次实现通用接口:
public class SamplerPack : IContains<Coors, SamplerPack>, IContains<Miller, SamplerPack>
{
public SamplerPack Add(Coors element)
{
// Add logic removed for brevity
return this;
}
public SamplerPack Add(Miller element)
{
// Add logic removed for brevity
return this;
}
}
不再找到扩展方法:
'SamplerPack'不包含'CoorsExtension'的定义,并且没有扩展方法'CoorsExtension'可以找到接受类型'SamplerPack'的第一个参数(你是否缺少using指令或汇编引用?)
我想了解为什么会失败,如果可能的话,如何修复它。
答案 0 :(得分:2)
那么,你的第二个实现有一个很大的不同:它尝试实现两次通用接口,具有不同的类型......
因此,您不能再从类的实例访问接口扩展方法,而只能从两个接口之一的“显式实例”访问。
这意味着您不能再使用var
,而是
IContains<Coors, SamplerPack> beer = new SamplerPack();
beer.CoorsExtensions();
或在调用所需的扩展方法之前将啤酒投射到所需的界面。
var beer = new SamplerPack();
((IContains<Coors, SamplerPack>)beer).CoorsExtensions();
顺便说一句,我宁愿选择两个类(一个用于Coors
,一个用于Miller
)以避免这种混淆(这两个类可以从一个抽象基类继承以避免添加的冗余实现。
当然,关于编译器为什么不抱怨的理论解释将是有用的......