为什么必须在VB中实现属性.ReadOnly'说明符

本文关键字:ReadOnly 说明符 属性 实现 VB 为什么 | 更新日期: 2023-09-27 18:02:48

c#中的以下工作:

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

下面的代码在VB中不起作用。净:

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#的方式来处理这种情况吗?

为什么必须在VB中实现属性.ReadOnly'说明符

我不确定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线程:如果一个接口定义了一个只读属性,实现者如何为这个属性提供Setter ?

您需要提供一个只读属性来实现I.X;如果你想要你的班级。如果X是一个读写属性,那么实现I.X的只读属性应该被赋予另一个名字(例如

)。<>之前公共属性Xreadonly作为整数实现I.X之前

我不太确定为什么。net要求使用三种类型的属性(只读、只写和读写),而不是简单地允许一个声明了只读属性和只写属性的对象被当作具有读写属性来使用,但它确实具有读写属性。也许是因为他们想要确保getter的重写将遵循与setter的重写相同的继承路径,但似乎在某些情况下,将getter和setter作为单独的项会更有用(例如,在某些情况下,让属性Get方法返回与Set方法类型不同但可强制的类型可能是有用的;或者有多个Set的重载也是有用的;

您在Interface I的属性上有ReadOnly,但在继承的Class C中没有,因此属性签名不匹配,因此出现错误。我敢肯定你不能添加set访问ReadOnly属性。