实现具有实现所需返回类型的返回类型的接口

Eri*_*ric 1 .net c# generics

为什么我不能这样做?

IHasOperatingSystem {
IOperatingSystem OperatingSystem { get; }
} 

Computer<T> : IHasOperatingSystem where T : IOperatingSystem {
public T OperatingSystem { get; }
}
Run Code Online (Sandbox Code Playgroud)

它告诉我类型应该是IOperatingSystem,但如果T实现IOperatingSystem,那应该不够吗?

此外,我意识到这个问题的标题可能有点令人困惑,但我想不出更好的方式来表达它.

Jon*_*eet 6

它告诉我类型应该是IOperatingSystem,但如果T实现IOperatingSystem,那应该不够吗?

不,这不是C#的工作方式.为了实现接口或覆盖方法,参数类型和返回类型必须完全匹配.从C#5规范的第13.4.4节:

出于接口映射的目的,类成员A在以下情况下匹配接口成员B:

  • A和B是方法,A和B的名称,类型和形式参数列表是相同的.
  • ...

(这里"type"应该被理解为"返回类型".)

现在你可以使你的IHasOperatingSystem类型通用,当然:

public interface IHasOperatingSystem<T> where T : IOperatingSystem
{
    T OperatingSystem { get; }
}

public class Computer<T> : IHasOperatingSystem<T> where T : IOperatingSystem
{
    public T OperatingSystem { get { ... } }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以在Computer<T>类中使用显式接口实现:

public interface IHasOperatingSystem
{
    IOperatingSystem OperatingSystem { get; }
} 

public class Computer<T> : IHasOperatingSystem where T : IOperatingSystem
{
    // Explicit interface implementation...
    IHasOperatingSystem.OperatingSystem IOperatingSystem
    {
        // Delegate to the public property
        get { return OperatingSystem; }
    }

    public T OperatingSystem { get { ... } };
}
Run Code Online (Sandbox Code Playgroud)