pode-se fazer referência a um mesmo nome da propriedade implícita em uma implementação de interface explícita?
-
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
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.