2017-09-11 209 views
2

为什么以下是不可能的特定原因?使用抽象接口成员的具体实现来实现接口

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; } 
} 

我认为上述代码自MyInt实现IInt以来成功实现了IHaveInts。

回答

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类型值的成员实现该属性。

相关问题