为什么AC#类可以隐式和明确地从一个接口继承?

Mor*_*eng 16 c# inheritance explicit implicit

今天我碰巧发现一个C#类可以以隐式和显式方式继承一个接口.这让我感到惊讶.如果C#以这种方式工作,那么当以不同方式引用时,一个实例的行为会有所不同.

interface IFoo
{
    void DoSomething();
}

class Foo : IFoo
{
    #region IFoo Members
    public void DoSomething()
    {
        Console.WriteLine("do something implicitly");
    }
    #endregion

    #region IFoo Members
    void IFoo.DoSomething()
    {
        Console.WriteLine("do something explicitly");
    }
    #endregion
}


        Foo f = new Foo();
        f.DoSomething();

        ((IFoo)f).DoSomething();
Run Code Online (Sandbox Code Playgroud)

上面的代码运行和输出

do something implicitly
do something explicitly
Run Code Online (Sandbox Code Playgroud)

我相信这种C#设计会使行为不一致.也许强制一个C#类可以以隐式或expliict方式从一个接口继承,但不能同时从两个接口继承.

有没有理由为什么C#以这种方式设计?

Mar*_*ade 13

实现接口的每个类都具有该类成员与接口成员之间的映射.如果类显式实现了接口成员,那么显式实现将始终映射到接口.如果没有显式实现,则需要隐式实现,并且该实现将映射到接口.

当一个类具有相同的会员名称和相关类型的接口,但它也明确地实现了该接口的相应成员,则类的"隐性"的实施考虑接口的实现在所有的(除非显式实现通话它).

除了在每种情况下类具有相同成员名称/类型的多个接口的不同含义之外,即使只有一个接口,该类本身也被认为具有隐式接口,该接口可能具有与唯一接口相同的成员/类型但仍然意味着不同的东西.


Hal*_*rim 11

您的例子并不能既含蓄,并明确实施的IFoo.您只能显式实现IFoo.DoSometing().您的类上有一个名为DoSomething()的新方法.它与IFoo.DoSomething无关,只是它具有相同的名称和参数.


Jon*_*eet 7

这使得它在发生碰撞时更加灵活.特别是,看看IEnumeratorIEnumerator<T>- 他们都有一个Current属性,但有不同的类型.您必须使用显式接口实现才能实现这两者(并且泛型形式扩展了非泛型形式).