为什么VB.NET中的实现属性必须匹配'ReadOnly'说明符?

时间:2011-07-20 15:12:00

标签: c# .net vb.net interface properties

以下适用于C#:

interface I
{
    int X { get; }
}

class C : I
{
    public int X
    {
        get { ... }
        set { ... }
    }
}

以下在VB.NET中不起作用:

Interface I
    ReadOnly Property X As Integer
End Interface

Class C
    Implements I

    Public Property X As Integer Implements I.X
        Get
            ...
        End Get
        Set(value As Integer)
            ...
        End Set
    End Property
End Class

错误消息Implementing property must have matching 'ReadOnly' or 'WriteOnly' specifiers非常明显,所以我知道这里有什么问题。这也不是一个大问题,因为解决这个限制很容易。

我很好奇:有人知道为什么VB设计师决定以不同于C#的方式处理这种情况吗?

3 个答案:

答案 0 :(得分:3)

我不确定VB方面,但是在C#中使用I.X的显式接口实现,你也会对添加的setter抱怨:

interface I
{
    int X { get; }
}

class C : I
{
    int I.X  // explicit implementation of I.X
    {
        get { return 1; }
        set { }
    }
}

你在C#中遇到类似的错误。对于VB,可能想要查看此SO线程:If an interface defines a ReadOnly Property, how can an implementer provide the Setter to this property?

答案 1 :(得分:1)

您需要提供只读属性来实现I.X;如果你想让YourClass.X成为一个读写属性,那么实现I.X的只读应该给另一个名字(例如

    Public Property Xreadonly As Integer Implements I.X

我不太清楚为什么.Net需要使用三种类型的属性(只读,只写和读写),而不是简单地允许声明只读属性的对象和只写属性,就像它具有读写属性一样,但确实如此。也许是因为他们想要确保覆盖getter将遵循与setter的覆盖相同的继承路径,但似乎有些情况下将getter和setter作为单独的项更有用(在某些情况下,例如,让一个属性Get方法返回一个与Set方法类型不同但可强制的类型可能是有用的;或者有多个Set的重载可能很有用;但在.net中也不允许这样做,尽管)。

答案 2 :(得分:0)

ReadOnly中的属性上有Interface I但未继承Class C,因此属性签名不匹配,因此出错。我确定您也无法为set属性添加ReadOnly访问者。