使用抽象接口成员的具体实现实现接口

时间:2017-09-11 23:02:45

标签: c#

是否存在以下不可能的特定原因?

class ClassOfInts : IHaveInts
{
    public MyInt IntHolder { get; }
    // This solves my use case but i'm unsure why this is necessary
    // IInt IHaveInts.IntHolder { get => IntHolder; }
}

interface IHaveInts
{
    IInt IntHolder { get; }
}


class MyInt : IInt
{
    public int TheInt { get; }
}

interface IInt
{
    int TheInt { get; }
}

我认为上面的代码成功实现了IHaveInts,因为MyInt实现了IInt。

1 个答案:

答案 0 :(得分:4)

  

是否存在以下不可能的特定原因?

嗯,简短的回答是:“因为C#规范不允许它”。更长的答案通常涉及一些关于C#语言设计者思维过程中的内容的猜测。这使得这些问题主要以意见为基础。

然而,他们确实做了一个慎重的选择,接口成员必须按照声明的方式精确地实施,而这种选择就是你不能这样做的原因。这种选择背后的一个可能原因是它们必须具有特殊情况的只读属性,因为允许以可写属性的方式实现该属性将是不安全的。如果他们允许这样做,您就可以将任何 IInt值分配给只需要MyInt值的属性。

也就是说,根据您实际尝试的内容,您可以使用泛型类型差异来支持您的方案。这将很好地编译:

public class ClassOfInts : IHaveInts<MyInt>
{
    public MyInt IntHolder { get; }
}

public interface IHaveInts<out T> where T : IInt
{
    T IntHolder { get; }
}

声明这样,以下工作正常:

static void M()
{
    IHaveInts<IInt> haveInts = new ClassOfInts();
}

这在语义上等同于您最初尝试的操作。也就是说,在使用接口类型时,您具有类型IInt的属性,但是您希望使用返回类型MyInt的值的成员实现该属性。