繁体   English   中英

意外的C#接口实现编译器错误

[英]Unexpected c# interface implementation compiler error

我今天才遇到这种奇怪的行为:

interface IFooBar
{
    void Foo();
    void Bar();
}

class FooBar : IFooBar
{
    void IFooBar.Foo()
    {
    }

    void IFooBar.Bar()
    {
        this.Foo();
    }
}

这行this.Foo(); 引发编译器错误

'MyProject.FooBar'不包含'Foo'的定义,并且找不到扩展方法'Foo'接受类型为'MyProject.FooBar'的第一个参数(您是否缺少using指令或程序集引用?)

如果我选择公共方法而不是interface.method声明样式,则代码将编译:

class FooBarOk : IFooBar
{
    public void Foo()
    {
    }

    public void Bar()
    {
        this.Foo();
    }
}

我想了解为什么会出现此错误,以及如何使用interface.method表示法解决该错误。

您是否尝试过在代码中使用接口语法?

((IFooBar)this).Foo ();

我希望这是因为实现实际上是隐藏的,确保您必须将其IFooBar转换为IFooBar才能使用。

要变通解决,您可以编写:

((IFooBar)this).Foo();

查看Explicit Interface Implementation Tutorial,以回答为什么this.Foo()不起作用。

这称为显式接口实现。 它使您可以实现接口,而无需公开公开这些方法。 例如,您可以实现IDisposable,但提供一个公共Close()方法,这对于您的api用户可能更有意义。 在内部,IDisposable.Dispose()方法将调用您的Close方法。

interface IFooBar
{
    void Foo();
    void Bar();
}

class FooBar : IFooBar
{
    void IFooBar.Foo()
    {
    }

    void IFooBar.Bar()
    {
        ((IFooBar)this).Foo();
    }
}

是您调用Foo方法的一种方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM