Почему возникает синтаксическая ошибка, когда в операторе IF проверяется пустая функция - PullRequest
0 голосов
/ 15 июля 2010

Что будет выводом, если я напишу

В C ++ if(5) будет выполнено без каких-либо проблем, но не в C # так же, как и в случае его запуска.

if(func()){} //in C# it doesn't runs Why how does C# treats void and how in Turbo C++

void func()
{
return;
}

if(null==null){}//runs in C#

РЕДАКТИРОВАТЬ

if(printf("Hi"){} //will run and enter into if statement

if(printf(""){}//will enter into else condition if found.

Этот вопрос не предназначен для тех, кто не знает о Turbo Compiler

Ответы [ 5 ]

5 голосов
/ 15 июля 2010

В C # тип условия в операторе if должен быть неявно преобразован в bool.Это уменьшает ошибки в различных ситуациях, и в основном это хорошо.Он предотвращает компиляцию таких вещей:

int x = ...;
if (x = 10) // Valid in C / C++, not in C#

Даже в C и C ++ достойный компилятор предупредит вас в приведенной выше строке, если у вас есть разумный уровень предупреждений.

Я удивлен, если версия void работает в C ++, хотя ...

3 голосов
/ 15 июля 2010

Функция void вообще ничего не возвращает, поэтому ее возвращаемое значение не может быть проверено с помощью оператора if.

Даже C ++ не позволит вам сделать это.

3 голосов
/ 15 июля 2010

В отличие от C / C ++, условия C # могут применяться только к логическим значениям.
Обратите внимание, что функция void не имеет возвращаемого значения, поэтому к ней нельзя применять условия.

1 голос
/ 15 июля 2010

в C / C ++, ненулевое целочисленное значение совпадает с логическим истиной. Причина этого в том, что в C / C ++ не был определен логический тип, поэтому в качестве логических переменных были использованы целые числа. Позже люди узнали, что этот вид неявного преобразования типов может вызвать непредвиденное поведение, когда компилятор пытается найти соответствующую перегруженную версию функции, поэтому ошибка не повторялась в C #.

Чтобы получить такое же поведение в C #, напишите if (x!=0) { ... }

0 голосов
/ 15 июля 2010

В C и C ++ существует неявное преобразование int, указателей и большинства других типов в bool.

Разработчики C # выбрали , а не , чтобы иметь это, для ясности.

То же самое с

int i = 1;
int* P = null;

if (i && p) { } // OK in C++

if (i != 0 && p != null) { }  // OK in C++ and C#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...