Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用接口和扩展方法发现的多个实现_C#_.net - Fatal编程技术网

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

C# 通用接口和扩展方法发现的多个实现,c#,.net,C#,.net,我很难理解为什么通用接口的扩展方法在第二次实现时找不到 这里有一个人为的例子来说明这个问题。最初,这是可行的。我马上就把它打破: public interface IContains<in TBeer, out TPack> { TPack Add(TBeer element); } public class Coors { } public class Miller { } public class SamplerPack : IContains<Coors, S

我很难理解为什么通用接口的扩展方法在第二次实现时找不到

这里有一个人为的例子来说明这个问题。最初,这是可行的。我马上就把它打破:

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;
    }
}
不再找到扩展方法:

“SamplerPack”不包含“CoorExtension”的定义,并且找不到接受“SamplerPack”类型的第一个参数的扩展方法“CoorExtension”(是否缺少using指令或程序集引用?)


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

好吧,您的第二个实现有一个主要区别:它尝试实现两次通用接口,使用不同的类型

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

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

IContains<Coors, SamplerPack> beer = new SamplerPack();
beer.CoorsExtensions();
IContains啤酒=新的采样器包();
beer.CoorsExtensions();
或者在调用所需的扩展方法之前将beer强制转换到所需的接口

var beer = new SamplerPack();
((IContains<Coors, SamplerPack>)beer).CoorsExtensions();
var-beer=new SamplerPack();
((i包含)啤酒);
顺便说一下,我宁愿选择两个类(一个用于
Coors
,一个用于
Miller
),以避免此类混淆(这两个类可能继承自抽象基类,以避免Add的冗余实现)


当然,从理论上解释编译器为什么不抱怨是有用的…

我认为这里的问题是,你的啤酒没有通用的基类。此外,您似乎错误地使用了
in
out
(它们不识别为输入或返回值),它们识别协方差和逆变。如果您的啤酒类型继承自一个基本的
beer
类,这将变得容易得多。
var beer = new SamplerPack();
((IContains<Coors, SamplerPack>)beer).CoorsExtensions();