Warum können die ReadOnly-Eigenschaften von Interface in VB.NET nicht überschrieben werden, wenn sie in C # .NET gültig sind?

8

(dies steht im Zusammenhang mit diese andere Frage )

Wenn Sie eine Schnittstelle definieren, für die es eine Eigenschaft mit nur einem Getter (= ReadOnly in VB.NET) gibt, warum können Sie den Setter in implementierenden Klassen mit C # definieren, aber nicht mit VB ?

Ich hätte gedacht, dass es auf .NET-Ebene definiert wurde und nicht sprachspezifisch.

Beispiel: für diese Schnittstelle

%Vor%

oder

%Vor%

Dies ist eine korrekte Implementierung in C #:

%Vor%

Aber das ist in VB.NET ungültig

%Vor%

UPDATE 2015/04/23

Es stellt sich heraus, dass diese Funktion Teil von VB14 ist! Siehe Sprachfunktionen in C # 6 und VB 14 und Neue Sprachfunktionen in Visual Basic 14 :

  

ReadOnly-Schnittstelleneigenschaften können von ReadWrite-Requisiten implementiert werden   Dies räumt eine seltsame Ecke der Sprache auf. Schau dir dieses Beispiel an:

%Vor%      

Wenn Sie zuvor die ReadOnly-Eigenschaft I.P implementiert haben, dann   Sie mussten es auch mit einer ReadOnly-Eigenschaft implementieren. Nun das   Einschränkung wurde gelockert: Sie können es mit einem Lese- / Schreibzugriff implementieren   Eigenschaft, wenn Sie möchten. In diesem Beispiel wird es mit a implementiert   Autoprop lesen / schreiben, aber Sie können auch eine Eigenschaft mit getter und verwenden   Setter.

    
tsimbalar 14.06.2011, 08:52
quelle

2 Antworten

11

Seien Sie vorsichtig, wenn Sie annehmen, dass VB.NET und C # dieselbe Sprache sind, die mit einem anderen Akzent gesprochen wird - das sind sie nicht.

Weil VB.NET die Implementierung eines Interface-Members erfordert, um diese Implements -Klausel zu haben und zu sagen, welches Member es implementiert. Mit C # können Sie Schnittstellenelemente explizit (SORT OF wie VB.NET) oder implizit (kein VB.NET-Äquivalent) implementieren. Daher ist die aktuelle C # -Version davon

%Vor%

und das macht einen Fehler:

  

Fehler CS0550: "ConsoleApplication171.Implementer.ConsoleApplication171.IPublicProperty.PublicProperty.set" fügt einen Accessor hinzu, der nicht im Schnittstellenmember "ConsoleApplication171.IPublicProperty.PublicProperty"

gefunden wurde
    
AakashM 14.06.2011, 09:14
quelle
0

In .net ist es erforderlich, dass eine Implementierung einer schreibgeschützten Eigenschaft in einer Schnittstelle einen Getter, aber keinen Setter und für die Implementierung einer Lese-Schreib-Eigenschaft sowohl einen Getter als auch einen Setter enthält. Es ist auch notwendig für die Implementierung einer schreibgeschützten Eigenschaft (wenn man so etwas definiert), einen Setter, aber keinen Getter einzubeziehen.

Wenn in C # eine Klasse eine öffentliche Eigenschaft mit demselben Namen wie eine Eigenschaft in einer Schnittstelle definiert, implementiert die öffentliche Eigenschaft die von dieser Schnittstelle benötigten Methoden, und die Klasse implementiert die Schnittstelleneigenschaft nicht explizit, der Compiler wird dies automatisch tun Generieren Sie eine Eigenschaft, die den Getter und / oder Setter der öffentlichen Eigenschaft verwendet. Auch wenn eine Klasse drei Schnittstellen implementiert, eine mit einer schreibgeschützten Eigenschaft Foo , eine mit einer schreibgeschützten Eigenschaft Foo und eine mit einer schreibgeschützten Eigenschaft Foo , einer öffentlichen Lese- / Schreibeigenschaft Foo kann verwendet werden, um die Eigenschaft Foo für alle von ihnen zu implementieren.

Vom Konzept her gibt es keinen Grund, warum vb.net kein ähnliches Feature anbieten könnte und zwei (oder sogar drei) verschiedene Eigenschaften erzeugen könnte, die für die Implementierung von Schnittstellen erforderlich sind. Zumindest wenn ein Mitglied der vb.net-Klasse als Implementierer eines Interface-Members markiert ist, wird erwartet, dass es das Member perfekt ohne Wrapping anpasst.

    
supercat 30.10.2012 19:52
quelle

Tags und Links