Поиск

Как if выполняется в С#

Новички в С# могут "пойматься" на том, что результатом вычисления выражения в операторе //должно быть булевское значение. Этим С# отличается от таких языков как C++, которые позволяют в операторе if сравнивать любые переменные на их совпадение с нулем. Этот пример показывает, какие распространенные ошибки могут допустить разработчики на C++, впервые применяя операторы if в С#:

using System;
interface ITest
{ }
class TestClass : ITest
{
>
class InvalidlfApp {
protected static TestClass GetTestClassO
{
return new TestClassQ;
}
public static void Main() {
int foo = 1;
if (foo) // Ошибка: попытка перевести int в bool.
{ }
TestClass t = GetTestClassO;
if (t) // Ошибка; попытка перевести TestClass в bool.
{
Console.WriteLine("{0}", t);
ITest i = t as ITest;
if (i) // Ошибка; попытка перевести ITest в bool.
{
// Методы ITest } } } }

Попытавшись скомпилировать этот код, вы получите такие сообщения об ошибках компилятора С#:

invalidlf.cs(22,7): error CS0029:
Cannot implicitly
convert type 'int' to 'bool' invalidlf.cs(27,7):
error CS0029: Cannot implicitly
convert type 'TestClass' to 'bool'
invalidlf.cs(31,14): warning CS0183:
The given expression is always of the provided ('ITest')
type invalidlf.cs(32,8): error CS0029: Cannot implicitly
convert type 'ITest' to 'bool'

Как видите, компилятор трижды "ругнулся" в ответ на попытки использовать в операторе //выражения с небулевскими значениями. Причина в том, что проектировщики С# хотели помочь вам избавиться от неоднозначного кода и предполагали, что компилятор должен заставлять оператор if выполнять свою "естественную" функцию — управлять ходом программы на основе результата логической проверки. Ниже пример переписан так, чтобы компилятор не выдавал сообщений об ошибках. Каждая строка из предыдущей программы, вызывавшая ошибку, переписана так, чтобы выражение возвращало булевский результат, и компилятор успокоился.

using System;
interface ITest
{
>
class TestClass : ITest
{
}
class ValidlfApp
protected static TestClass GetTestClassO
{
return new TestClassO;
}
public static void Hain()
{
int foo = 1; if (foo > 0) { }
TestClass t = GetTestClassO;
if (t != null)
{
Console.WriteLine("{0>", t);
ITest i = t as ITest; if (i != null)
<
// Методы ITest.
} } > }