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 aqui, e o que isso significa?

Foi útil?

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!

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