开发者

Why must an implementing property in VB.NET have matching 'ReadOnly' specifiers?

The following works in C#:

interface I
{
    int X { get; }开发者_运维技巧
}

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

The following does not work in 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

The error message Implementing property must have matching 'ReadOnly' or 'WriteOnly' specifiers is pretty self-explanatory, so I do know what's wrong here. It's also not a big issue, because it's quite easy to work around this limitiation.

I'm curious, though: Does anyone know why the VB designers decided to treat this case differently than in C#?


I'm not sure about the VB side, but with the explicit interface implementation of I.X in C# you'd also get a complaint about the added setter:

interface I
{
    int X { get; }
}

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

You get a similar error in C#. For the VB, may want to check out this SO thread: If an interface defines a ReadOnly Property, how can an implementer provide the Setter to this property?


You need to provide a read-only property to implement I.X; if you want YourClass.X to be a read-write property, then the read-only that implements I.X should be given another name (e.g.

    Public Property Xreadonly As Integer Implements I.X

I'm not quite sure why .Net requires the use of three types of properties (read-only, write-only, and read-write), rather than simply allowing an object which declares a read-only property and a write-only property to be used as though it has a read-write property, but it does. Perhaps its because they wanted to ensure that an override of a getter will follow the same inheritance path as an override of a setter, but it would seem there are cases where regarding getters and setters as separate items would be more useful (in some cases, for example, it may be useful to have a property Get method return a type which is distinct from, but coercible to, the Set method type; or it may be useful to have multiple overloads of Set; neither is allowed in .net, though).


You have ReadOnly on the Property in the Interface I but not in the inherited Class C so the Property signatures don't match, hence the error. I'm sure you can't add a set accessor to a ReadOnly Property too.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜