В Java и C # отказались от неявных преобразований в логические значения , чтобы уменьшить вероятность ошибки программиста .
Например, многие программисты случайно написали бы:
if( x = 5 ) { ... }
вместо:
if( x == 5 ) { ... }
Что, конечно, приводит к совершенно другому поведению, поскольку первый оператор выполняет присваивание (что всегда приводит к истине), а второй выполняет сравнение. В прошлом разработчики иногда писали такие задания в обратном порядке, чтобы избежать ловушки, поскольку:
if( 5 = x ) { ... } // doesn't compile.
Теперь в C # вы все еще можете создавать неявные операторы преобразования в bool
для своих собственных типов - хотя это редко рекомендуется, поскольку большинство разработчиков этого не ожидают:
public class MyValue
{
public int Value { get; set; }
public static implicit operator bool( MyValue mb )
{
return mb.Value != 0;
}
}
MyValue x = new MyValue() { Value = 10; }
if( x ) { ... } // perfectly legal, compiler applies implicit conversion