c#接口问题

c#接口问题,c#,inheritance,interface,C#,Inheritance,Interface,我有以下代码: // IMyInterface.cs namespace InterfaceNamespace { interface IMyInterface { void MethodToImplement(); } } 这段代码编译得很好(为什么?)。但是,当我尝试使用它时: // Main.cs static void Main() { InterfaceImplementer iImp = new Inte

我有以下代码:

// IMyInterface.cs

namespace InterfaceNamespace
{
    interface IMyInterface
    {
        void MethodToImplement();
    }
}

这段代码编译得很好(为什么?)。但是,当我尝试使用它时:

// Main.cs

    static void Main()
    {
        InterfaceImplementer iImp = new InterfaceImplementer();
        iImp.MethodToImplement();
    }
我得到:

i、 e.
MethodToImplement
从外部看不到。但如果我做了以下改变:

// InterfaceImplementer.cs
class InterfaceImplementer : IMyInterface
{

    public void MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }
}

那么Main.cs也可以很好地编译。为什么这两者之间存在差异?

通过,您正在创建一个只能通过强制转换到接口来调用的私有方法。

区别在于支持一个接口方法与另一个方法冲突的情况。引入了“显式接口实现”的思想

您的第一次尝试是显式实现,它需要直接使用接口引用(而不是实现接口的某个对象的引用)

您的第二次尝试是隐式实现,它也允许您使用实现类型

要查看显式接口方法,请执行以下操作:

MyType t = new MyType();
IMyInterface i = (IMyInterface)t.
i.CallExplicitMethod(); // Finds CallExplicitMethod
IMyOtherInterface oi = (MyOtherInterface)t;
oi.CallExplicitMethod();
那么,您是否应该具备以下条件:

MyType t = new MyType();
IMyInterface i = (IMyInterface)t.
i.CallExplicitMethod(); // Finds CallExplicitMethod
IMyOtherInterface oi = (MyOtherInterface)t;
oi.CallExplicitMethod();

类型系统可以找到正确类型上的相关方法,而不会发生冲突。

如果要实现类的接口,则接口中的方法必须在类中,并且所有方法也应该是公共的

class InterfaceImplementer : IMyInterface
{

    public void MethodToImplement()
    {
        Console.WriteLine("MethodToImplement() called.");
    }
}
你可以这样调用这个方法

IMyInterface _IMyInterface = new InterfaceImplementer();
IMyInterface.MethodToImplement();

+答案是1,但我有一个问题……不起作用的实现者将接口实现为“void InterfaceNamespace.MethodToImplement”。你能帮我弄清楚它实际上在做什么吗?是Namespace.InterfaceMethodName而不是Namespace.Interface.InterfaceMethodName…我还在睡觉吗?@Craig:我也在想,这没有意义,也不会编译,这可能是个错误。@H.B.对,当然不会编译了…谢谢,我想我可能是在做梦。您将获得is名称空间,但其使用方式类似于类型错误。可能只是你说的典型。不确定您是否应该在该上下文中使用“private”一词。
此代码编译得很好
,没有<代码>“InterfaceNamespace”是一个“名称空间”,但与“类型”一样使用。。为简单和隐私起见,对代码的某些部分进行了修改/重命名。当复制粘贴时,有问题的示例代码可能不起作用,但它解释了问题,但不要声称它起作用!(我修正了错误…)