通用接口和扩展方法发现的多个实现

时间:2015-08-12 19:08:53

标签: c# .net

我无法理解为什么第二次实施时无法找到通用接口的扩展方法。

这是一个用来说明问题的人为例子。最初,这是有效的。我马上打破它:

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有效:

Visual Studio screen grab

如果我再次实现通用接口:

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指令或汇编引用?)

我想了解为什么会失败,如果可能的话,如何修复它。

1 个答案:

答案 0 :(得分:2)

那么,你的第二个实现有一个很大的不同:它尝试实现两次通用接口,具有不同的类型......

因此,您不能再从类的实例访问接口扩展方法,而只能从两个接口之一的“显式实例”访问。

这意味着您不能再使用var,而是

IContains<Coors, SamplerPack> beer = new SamplerPack();
beer.CoorsExtensions();

或在调用所需的扩展方法之前将啤酒投射到所需的界面。

var beer = new SamplerPack();
((IContains<Coors, SamplerPack>)beer).CoorsExtensions();

顺便说一句,我宁愿选择两个类(一个用于Coors,一个用于Miller)以避免这种混淆(这两个类可以从一个抽象基类继承以避免添加的冗余实现。

当然,关于编译器为什么不抱怨的理论解释将是有用的......

相关问题