No livro C#12 In a Nutshell (p. 259 Capítulo Sobrecarga de verdadeiro e falso), eles nos fornecem este exemplo para ilustrar como sobrecarregar os operadores verdadeiro e falso.
SqlBoolean a = SqlBoolean.Null;
if (a)
Console.WriteLine ("True");
else if (!a)
Console.WriteLine ("False");
else
Console.WriteLine ("Null");
public struct SqlBoolean
{
public static bool operator true (SqlBoolean x)
{
return x.m_value == True.m_value;
}
public static bool operator false(SqlBoolean x)
{
return x.m_value == False.m_value;
}
public static SqlBoolean operator ! (SqlBoolean x)
{
if (x.m_value == Null.m_value) return Null;
if (x.m_value == False.m_value) return True;
return False;
}
public static readonly SqlBoolean Null = new SqlBoolean (0);
public static readonly SqlBoolean False = new SqlBoolean (1);
public static readonly SqlBoolean True = new SqlBoolean (2);
SqlBoolean (byte value) { m_value = value; }
byte m_value;
}
Estou tentando entender quando a false
sobrecarga é chamada, e pelo meu entendimento (e confirmando brincando com o depurador), parece que ela nunca é chamada. Por que a false
sobrecarga seria útil então? Já que só usamos while (a)
or , etc ... Sobrecarregar and while (!a)
não seria o suficiente?true
!
O padrão C# tem esta nota :
Seguindo esses links, você verá que o
false
operador é usado em operadores lógicos condicionais :Aqui está um código de teste para mostrar os vários momentos em que os operadores são usados:
Saída:
O operador falso entrará em ação quando houver curto-circuito envolvido - com
&&
o operador, quando se a primeira expressão falhar, podemos ignorar a segunda.Nessa situação, o operador falso será invocado, veja o exemplo:
e então o teste: