C# 为什么VB.NET中的实现属性必须具有匹配的';只读';说明符?

C# 为什么VB.NET中的实现属性必须具有匹配的';只读';说明符?,c#,.net,vb.net,interface,properties,C#,.net,Vb.net,Interface,Properties,以下是C#中的工作: 以下内容在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)

以下是C#中的工作:

以下内容在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
错误消息
实现属性必须有匹配的'ReadOnly'或'WriteOnly'说明符
是非常自解释的,所以我知道这里出了什么问题。这也不是什么大问题,因为绕过这个限制很容易


不过我很好奇:有人知道为什么VB设计师决定用与C#不同的方式来处理这个问题吗?

我不确定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线程:

您在
接口I
中的属性上有
只读
,但在继承的
类C
中没有,因此属性签名不匹配,因此出现错误。我确信您也不能将
访问器添加到
只读
属性。

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

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

我在界面的C版本中没有看到您的属性的只读?@Nikki9696:基本上,C版本中缺少setter是等效的。@Nikki9696是隐含的。区别在于它不需要是只读的。但是,Heinzi,您在VB.NET界面版本中显式指定了它,所以这是一个相当大的区别。可能的区别是不幸的是,我不是一个VB的家伙,所以我在玩VB,看看如何做与你的第一个C#示例相同的事情…看起来有人有这个问题,请看:问题是为什么你不能使用非只读属性来实现一个只需要getter的接口。
interface I
{
    int X { get; }
}

class C : I
{
    int I.X  // explicit implementation of I.X
    {
        get { return 1; }
        set { }
    }
}
Public Property Xreadonly As Integer Implements I.X