2011-07-20 39 views
5

在C#以下工作:为什么VB.NET中的实现属性必须匹配'ReadOnly'说明符?

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

我在界面的C版本中看不到您的属性中的只读属性? – Nikki9696

+0

@ Nikki9696:基本上C#版本中缺少setter是等价的。 –

+0

@ Nikki9696暗示。不同之处在于它不需要。但是,Heinzi,你明确地在VB.NET界面版本中指定它,所以这是一个非常大的差异。 –

回答

3

我不知道VB的一面,但在C#中显式接口实现九,你也就会得到一个关于添加二传手投诉:

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?

+0

+1,非常好的一点! – Heinzi

+0

不幸的是,我不是一个VB的家伙,所以我正在玩VB,看看如何做同样的事情,你的第一个C#示例... –

+1

看起来像别人有这个问题,请参阅:http:///stackoverflow.com/questions/6307335/if-an-interface-defines-a-readonly-property-how-can-an-implementer-provide-the-s –

0

您在Interface I该物业有ReadOnly但不是在继承Class C所以物业签名不匹配,因此误差。我相信你也不能添加set访问者到ReadOnly属性。

+0

问题是为什么你不能使用非只读属性实现一个只需要一个getter的接口。 – CodesInChaos

1

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

 
    Public Property Xreadonly As Integer Implements I.X 

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

相关问题