以下适用于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#的方式处理这种情况吗?
答案 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
访问者。