2011-07-20 41 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中不允許)。

相關問題