В C
нет bool
. Соглашение состоит в том, что 0
является false
и != 0
является true
. if
оператор обрабатывает результат условного выражения именно таким образом.
В C++
bool
был введен. Но это было совместимо со старыми правилами, 0
обрабатывалось как false
и false
как 0
, и было неявное преобразование между int
и bool
.
В C # это не так: есть bool
и int
, и они не конвертируемы друг в друга. Это то, что говорит C # Standard. Период.
Поэтому, когда вы пытались переопределить совместимость bool
и int
, вы допустили ошибку. Вы используете &&, который является логическим оператором, но в C # вы не можете переопределить его и только &, который реализован как побитовый. 1 & 2 == 0 == false
! вот оно!
Вы даже не должны перегружать битовые единицы, чтобы поддерживать совместимость, вам просто нужно оставить operator true
и false
.
Этот код работает так, как вы ожидаете:
class Programx
{
static void Main(string[] args)
{
MyInt a = 1, b = 2;
bool res = a && b;
Console.WriteLine("result is {0}", res);
}
class MyInt
{
public int val;
public static bool operator true(MyInt t)
{
return t.val != 0;
}
public static bool operator false(MyInt t)
{
return t.val == 0;
}
public static implicit operator MyInt(int v)
{
return new MyInt() { val = v };
}
public static implicit operator bool(MyInt t)
{
return t.val != 0;
}
}
}
результат равен True