C# 不明白为什么这是不允许的

C# 不明白为什么这是不允许的,c#,.net,interface,C#,.net,Interface,希望您能帮助理解这一点,这样做似乎很自然: public interface IJob { bool started { get; set; } } public interface IJobManager { void StartJob(IJob job); } public class SomeJob : IJob { public bool started { get; se

希望您能帮助理解这一点,这样做似乎很自然:

    public interface IJob
    {
        bool started { get; set; }
    }

    public interface IJobManager
    {
        void StartJob(IJob job);
    }

    public class SomeJob : IJob
    {
        public bool started { get; set; }
        public void OnlySomeJobDoesThis();
    }

    public class SomeJobManager : IJobManager
    {
        public void startJob(SomeJob job) { } // --> Error'SomeJobManager' does not implement interface member 'IJobManager.StartJob(IJob)' 
    }   
但正如您所看到的,它不会编译。我无法想象为什么。。只要SomeJob实现IJob接口 编译器不应该真正关心两个问题

首先,C区分大小写。您将该方法定义为StartJob大写字母S,但实现StartJob小写字母S


第二,您的方法接受了实现IJob的一些作业。但是您的接口说该方法应该能够接收IJob。也就是说,实现接口的任何类,它不仅限于某个作业。

您将IJob的具体实现传递给该方法,但它需要IJob的实例

只要做:

 public class SomeJobManager : IJobManager
{
    public void StartJob(IJob job) { } 
}
然后,当您调用StartJob时,只需传入某个Job:


想象一下,如果您有另一个实现IJob的类:

然后创建SomeJobManager的一个实例,如下所示:

IJobManager manager = new SomeJobManager();
manager.StartJob(new FooJob());
现在,当你这样称呼StartJob时:

IJobManager manager = new SomeJobManager();
manager.StartJob(new FooJob());
你希望发生什么?您的SomeJobManager需要一个SomeJob实例,但接口说if必须是IJob


如果您的代码被允许,您就违反了接口承诺的约定,即可以使用IJob调用StartJob。您在实现中已经说过,它必须至少是一个SomeJob,这是不同的。

您的接口表示,实现me的任何类都必须实现StartJob方法,该方法可以接受实现IJob的任何类

您的实现是说我的StartJob方法只适用于SomeJob,我不知道如何处理IJob的其他实现


您的实现比接口更具限制性,因此编译器不承认您的实现已满足接口要求。

因此,如果我将SomeJobManager强制转换为IJobManager并将我的SomeOtherJob:IJob传递给startJob,会发生什么情况?C区分大小写。startJob与startJob不同。如果您确实需要将其命名为小写,请显式实现接口。旁白:命名约定有助于避免大小写问题,并有助于训练眼睛发现问题。下面是C命名约定和建议的重要总结: