Peut-on référencer une propriété implicite du même nom dans une implémentation Interface explicite?

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

  •  19-08-2019
  •  | 
  •  

Question

Disons que j'ai un type qui implémente une propriété avec un type de chaîne:

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

Ensuite, j'ai une interface qui définit une propriété du même nom:

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

Je peux utiliser une interface explicite comme suit:

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

Cependant, si je veux pouvoir référencer la chaîne "Valeur" dans mon interface explicite, puis-je le faire? Si c'est le cas, comment? J'imagine que cela ressemble à quelque chose comme:

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

Comme vous pouvez le constater, je souhaite que la "chaîne valorisée" " " Valeur " propriété pour une expression dans la valeur "int évalué" " Valeur " propriété. Si c’était un autre membre d’interface explicitement implémenté, je pourrais transtyper le texte sur cette interface, puis l’utiliser, mais comment cela fonctionnerait-il pour un membre de type implicite?

Remarque: l'exemple est un peu artificiel, mais illustre, espérons-le, la question du langage.

Était-ce utile?

La solution

Pour un membre de type implicite, il suffit que Valeur ou this.Value convienne, car il ne sera pas résolu en IIntValued.Value . par défaut.

Autres conseils

Bien sûr, vous pouvez! Le problème est que vous plaçiez des mots clés d'accessibilité là où ils sont illégaux. Les membres explicitement implémentés ne peuvent pas avoir un mot clé d'accessibilité. Un implémenté implicitement serait écrit sans la IIntValue. préfixe au nom du membre.

Voici un exemple qui fonctionne.

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 { }
  }
}

Oui, vous pouvez accéder aux deux propriétés. Cela dépend du type de variable utilisé pour accéder à la propriété. Observez:

Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;

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

Ugh, après avoir écrit le résumé, je me suis rendu compte que je connaissais la réponse. : P Si je prends this et le transtype dans le type de classe, alors l'implémentation explicite ne sera pas incluse:

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

Modifier: Après quelques remarques supplémentaires (merci aux répondeurs!), il a été souligné qu'il n'était pas nécessaire de faire manuellement quelque chose que le compilateur fait automatiquement. Ainsi:

string value = this.Value;

aurait fonctionné. Ceci, bien sûr, parce que le ce n'est pas une variable d'interface et que la propriété implicite serait donc celle sélectionnée par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top