operador implícito
-
11-09-2019 - |
Pergunta
Eu só vi que ele estava usando em uma das respostas recentes:
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
Por que precisamos de palavra implícita ??em> aqui, e o que isso significa?
Solução
meio implícito que a conversão não requer um elenco em seu código.
Agora você pode fazer isso:
Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}
em vez de ter que fazer isso:
Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}
Um exemplo de por que isso é uma distinção útil é tipos numéricos. Há uma conversão implícita de tipos de "menores" aos tipos "maiores", por exemplo:
float f = 6.5;
double d = f; // implicit conversion
Mas a conversão de tipos maiores para tipos menores pode ser perigoso, então só há uma conversão explícita, forçando o usuário para esclarecer que ele realmente tem a intenção de realizar a operação em questão:
long l = 20;
// short s = l;
short s = (short)l; // explicit conversion
Outras dicas
que parece mau uso de um operador implícito. Eu não sei o que a classe Savepoint faz, mas convertê-lo para um booleano não parece lógico. O operador implícito permite verificar se uma referência Savepoint é nulo ou não, basta avaliar a referência:
if (point) {
em vez de:
if (point != null) {
Se ele é usado dessa forma, que está escondendo o que o código está realmente fazendo, e que vai contra praticamente tudo que C # é sobre.
Apenas para adicionar à resposta de mquander.
A partir da especificação da linguagem C # 3.0:
Um operador de conversão declaração de que inclui a palavra-chave
implicit
introduz um definido pelo utilizador implícito conversão. conversões implícitas pode ocorrem em uma variedade de situações, incluindo invocações membro função, expressões elenco e atribuições.
(secção 10.10.3)
Operadores de conversão converter de um tipo para outro. meios implícitos você não tem que digitar uma conversão explícita no código para a conversão acontecer, explícita requer que elenco no código a ser chamado.
Você usar o operador de conversão implícita quando tiver certeza de que a conversão não perder quaisquer dados. Por exemplo, com o alargamento coerções (int -> long, float -> duplo). operadores explícitos de conversão são usados ??quando algum estado serão perdidos ou você não quer compilador para parafuso automaticamente o código do cliente através da inserção de conversões em todo o lugar.
A conversão como a sua seria estragos realmente wreak porque é desaconselhável para executar esta conversão particular.
Você precisa especificar 'implícita', porque também há operadores explícitos.
Isto significa que a conversão entre booleana e Savepoint pode ser feito implicitamente, por exemplo = Escondido.
Savepoint s = new Savepoint();
bool b = s;
conversão explícita, por exemplo evidente, pode ser feito da seguinte maneira:
Savepoint s = new Savepoint();
bool b = (bool)s;
A conversão implícita é frequentemente utilizado quando não há perda de dados possível, ou seja Int16 (short)
para Int32 (int)
. Mas se é possível, você precisa 'concordo' com ele usando conversão explícita.
No seu caso, por exemplo, se Savepoint
é apenas um
struct Savepoint
{
public bool data;
}
Você pode usar conversão implícita, porque nenhuma perda de dados é possível:
Savepoint s = new Savepoint();
s.data = true;
bool b = s;
caso contrário, eu recomendo que você para definir operador explícita!