以下是不可能的,是否有特定原因?
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; }
}
Run Code Online (Sandbox Code Playgroud)
我认为上面的代码成功地实现了 IHaveInts,因为 MyInt 实现了 IInt。
以下是不可能的,是否有特定原因?
嗯,简短的回答是:“因为 C# 规范不允许这样做”。较长的答案通常涉及对 C# 语言设计者的思维过程的一些推测。这使得这些问题主要基于意见。
然而,他们确实做出了一个深思熟虑的选择,即接口成员必须按照声明的方式精确实现,而这个选择就是你不能这样做的原因。这种选择背后的一个可能原因是他们必须对只读属性进行特殊处理,因为允许以这种方式为可写属性实现属性是不安全的。如果他们允许这样做,您就可以为只需要值的属性分配任何 值。IIntMyInt
也就是说,根据您实际尝试执行的操作,您可能可以使用泛型类型差异来支持您的场景。这将编译正常:
public class ClassOfInts : IHaveInts<MyInt>
{
public MyInt IntHolder { get; }
}
public interface IHaveInts<out T> where T : IInt
{
T IntHolder { get; }
}
Run Code Online (Sandbox Code Playgroud)
以这种方式声明,以下工作正常:
static void M()
{
IHaveInts<IInt> haveInts = new ClassOfInts();
}
Run Code Online (Sandbox Code Playgroud)
这在语义上等同于您最初尝试执行的操作。也就是说,当使用接口类型时,您有一个 type 属性IInt,但您想使用一个返回 type 值的成员来实现该属性MyInt。