pode-se fazer referência a um mesmo nome da propriedade implícita em uma implementação de interface explícita?

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

  •  19-08-2019
  •  | 
  •  

Pergunta

dizer que tenho um tipo que implementa uma propriedade com um tipo de cadeia:

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

Então eu tenho uma interface que define uma propriedade com o mesmo nome:

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

Eu posso usar interface explícita da seguinte forma:

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

No entanto, se eu quero ser capaz de fazer referência ao string "Valor" na minha interface explícita, posso fazê-lo? Se sim, como? Imagino que seja algo como:

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

Como você pode ver, eu quero o "string valorizado" "Valor" propriedade para uma expressão no "int valorizado" "Valor" propriedade. Se fosse outro membro de interface implementada explicitamente, eu poderia typecast a essa interface e, em seguida, uso, mas como seria trabalhar para um membro de tipo implícito?

Nota:. O exemplo é um pouco artificial, mas espero que demonstra a questão da língua

Foi útil?

Solução

Para um membro de tipo implícito, apenas Value ou this.Value deve ser fino -., Porque não vai resolver a IIntValued.Value por padrão

Outras dicas

Claro que você pode! O problema é que você estava colocando palavras-chave acessibilidade, onde eles são ilegais. membros explicitamente implementados não pode ter uma palavra-chave acessibilidade. Um implicitamente implementado seria escrito com o IIntValue. prefixo para o nome do membro.

Aqui está um exemplo que funciona.

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

Sim, você pode acessar ambas as propriedades. Depende do tipo da variável usada para acessar a propriedade. Observe:

Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;

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

Ugh, depois de escrever o resumo, eu percebi que eu sabia a resposta. : P Se eu tomar this e typecast-lo para o tipo de classe, em seguida, a implementação explict não serão incluídos:

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

Editar: Depois de mais algumas entrada foi salientado que não há necessidade de fazer manualmente algo que o compilador está fazendo automaticamente (graças respondedores!). Assim:

string value = this.Value;

teria funcionado. Este é, naturalmente, porque o this não é uma variável de interface, e assim a propriedade implícita seria a única selecionada por padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top