Kann man sich eine mit demselben Namen implizite Eigenschaft in einer expliziten Interface-Implementierung verweisen?

StackOverflow https://stackoverflow.com/questions/650898

  •  19-08-2019
  •  | 
  •  

Frage

Sagen, ich habe einen Typen, der eine Eigenschaft mit einem String-Typ implementiert:

public class Record
{
     public string Value { get; set; }
}

Dann habe ich eine Schnittstelle, die eine Eigenschaft mit dem gleichen Namen definiert:

public interface IIntValued
{
     public int Value { get; set; }
}

kann ich explizite Schnittstelle wie folgt:

public class Record : IIntValued
{
     public string Value { get; set; }
     int IIntValued.Value 
     {
          get{ return 0; } set{}
     }
}

Allerdings, wenn ich in der Lage sein wollen, die Zeichenfolge „Wert“ in meiner ausdrücklichen Schnittstelle zu verweisen, kann ich es tun? Wenn das so ist, wie? Ich stelle mir es so etwas wie zu sein:

public class Record : IIntValued
{
     public string Value { get; set; }
     public int IIntValued.Value 
     {
          get
          {
               string value = /*Magic here*/.Value;
               return int.parse(value); 
          } 
          set{}
     }
}

Wie Sie sehen können, möchte ich die „String-Wert eines“ Eigenschaft „Wert“ für einen Ausdruck in der „int Wert“ Eigenschaft „Value“. Wenn es ein anderes explizit implementierte Schnittstelle Mitglied ist, ich zu dieser Schnittstelle typisieren könnte und dann verwenden, aber wie wäre es für einen impliziten Typ-Member arbeiten?

Hinweis: Das Beispiel etwas gekünstelt ist, aber hoffentlich zeigt die Sprachenfrage

.
War es hilfreich?

Lösung

Für ein implizites Typen Mitglied, nur Value oder this.Value sollte in Ordnung sein -. Weil es nicht standardmäßig IIntValued.Value wird lösen

Andere Tipps

Sicher Sie können! Das Problem ist, dass Sie die Zugänglichkeit Stichworte wurden Platzierung, wo sie illegal sind. Explizit implementierter Mitglieder können keine Zugänglichkeit Schlüsselwort haben. Ein implizit umgesetzt würde aus dem IIntValue geschrieben werden. Präfix des Elementnamen.

Hier ist ein Beispiel, das funktioniert.

public interface IIntValued
{
  int Value { get; set; }
}

public class Record : IIntValued
{
  public string Value { get; set; }
  int IIntValued.Value
  {
    get
    {
      string value = this.Value;
      return int.Parse(value);
    }
    set { }
  }
}

Ja, können Sie beiden Eigenschaften zugreifen. Es hängt von der Art der Variablen verwendet, um die Eigenschaft zuzugreifen. Beachten Sie:

Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;

string valueAsString = myInstanceAsRecord.Value;
int valueAsInt = myInstanceAsIIntValued.Value;

Ugh, nachdem die Zusammenfassung zu schreiben, wurde mir klar, dass ich die Antwort kannte. : P Wenn ich this nehmen und es in den Klassentyp typisiere, dann ist die explict Implementierung wird nicht enthalten sein:

string value = ((Record)this).Value; //is the implicit string.

Edit: Nach einigem weiteren Eingang wurde darauf hingewiesen, dass es keine Notwendigkeit, etwas zu tun, von Hand ist, dass der Compiler automatisch tut (Danke Responder!). Also:

string value = this.Value;

hätte gearbeitet. Dies ist natürlich, weil die this keine Schnittstelle variabel ist, und so die implizite Eigenschaft würde das eine standardmäßig aktiviert sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top