是否存在以下不可能的特定原因?
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。
答案 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
的值的成员实现该属性。