Возможно ошибочный пустой оператор

I am new to programming and I have come across an issue called a "Possible mistaken empty statement" now I have done a lot of research on this topic, and the solution I was given was to remove the ...

I am new to programming and I have come across an issue called a «Possible mistaken empty statement» now I have done a lot of research on this topic, and the solution I was given was to remove the semi colon after the if statement, however this only produces more warnings and more errors that I currently do not know the solution to, I would very much appreciate the help, the language I am using is C#.

if (checkBox5.Checked = true) ;
Double value5 = Convert.ToDouble(checkBox4.Checked);
value5 = +1;
Double result5 = value5;
label2.Text = Convert.ToString(result5);

asked Jan 26, 2013 at 11:39

user2013481's user avatar

0

I guess that this is what you want:

if (checkBox5.Checked == true)
{
    double value5 = Convert.ToDouble(checkBox4.Checked) + 1;
    label2.Text = value5.ToString();
}

= is assigment, whereas == is checking for equality, on the other hand semicolon after if will terminate whole if statement.

Note that when you are checking for true then you can use this:

if (checkBox5.Checked) {  }

answered Jan 26, 2013 at 11:40

Zbigniew's user avatar

ZbigniewZbigniew

26.8k6 gold badges57 silver badges65 bronze badges

You should use;

if (checkBox5.Checked == true)

not

if (checkBox5.Checked = true)

= is assignment operator, == is equality operator.

Check out;

  • http://msdn.microsoft.com/en-us/library/sbkb459w(v=vs.110).aspx
  • http://msdn.microsoft.com/en-us/library/53k8ybth(v=vs.110).aspx

And or course when you check your true value, you can use your if condition like;

if (checkBox5.Checked)
{
  // Do something if checkBox5 is checked.
}

And if you use semicolon after your if condition;

if (checkBox5.Checked = true) ;

is equivalent to

if (checkBox5.Checked = true) { }

So in your case I think you shouldn’t use semicolon either. Because if you use it, your code will be look like;

if (checkBox5.Checked = true)
{

}

Double value5 = Convert.ToDouble(checkBox4.Checked);
value5 = +1;
Double result5 = value5;
label2.Text = Convert.ToString(result5);

which I assume you don’t want to do this. And remember, even if there is no body to execute, doesn’t mean that the loop terminates.

answered Jan 26, 2013 at 11:41

Soner Gönül's user avatar

Soner GönülSoner Gönül

96k102 gold badges205 silver badges356 bronze badges

1

The problem is the semi-colon at the end of your if as well as the single ‘=’, should be:

if (checkBox5.Checked = true) ;

Should be:

if (checkBox5.Checked == true) // double '==' for equality comparison

answered Apr 5, 2013 at 19:50

Tom Studee's user avatar

Tom StudeeTom Studee

10.2k3 gold badges38 silver badges41 bronze badges

if (checkBox5.Checked == true) ; // or you can use if (checkBox5.Checked)
//                     ^------------------- `=` assignment operator must be `==` equals
{  // missed 
    Double value5 = Convert.ToDouble(checkBox4.Checked);
    value5 = +1;
//          ^_______________ I assume you need `=+` addition assignment operator instead
//                                     assigning `+1` to `value5 `
    Double result5 = value5;
    label2.Text = Convert.ToString(result5);
} /// missed 

answered Jan 26, 2013 at 11:47

Hamlet Hakobyan's user avatar

Hamlet HakobyanHamlet Hakobyan

32.7k6 gold badges51 silver badges68 bronze badges

In addition to @des and @Soner answers, why don’t you just do this :

if (checkBox5.Checked)

    label2.Text = Convert.ToDouble(checkBox5.Checked).ToString();

I’m assuming you don’t intend to increment value5 by 1 as it should be value5 += 1;

answered Jan 26, 2013 at 11:46

Abdusalam Ben Haj's user avatar

3

I am new to programming and I have come across an issue called a «Possible mistaken empty statement» now I have done a lot of research on this topic, and the solution I was given was to remove the semi colon after the if statement, however this only produces more warnings and more errors that I currently do not know the solution to, I would very much appreciate the help, the language I am using is C#.

if (checkBox5.Checked = true) ;
Double value5 = Convert.ToDouble(checkBox4.Checked);
value5 = +1;
Double result5 = value5;
label2.Text = Convert.ToString(result5);

asked Jan 26, 2013 at 11:39

user2013481's user avatar

0

I guess that this is what you want:

if (checkBox5.Checked == true)
{
    double value5 = Convert.ToDouble(checkBox4.Checked) + 1;
    label2.Text = value5.ToString();
}

= is assigment, whereas == is checking for equality, on the other hand semicolon after if will terminate whole if statement.

Note that when you are checking for true then you can use this:

if (checkBox5.Checked) {  }

answered Jan 26, 2013 at 11:40

Zbigniew's user avatar

ZbigniewZbigniew

26.8k6 gold badges57 silver badges65 bronze badges

You should use;

if (checkBox5.Checked == true)

not

if (checkBox5.Checked = true)

= is assignment operator, == is equality operator.

Check out;

  • http://msdn.microsoft.com/en-us/library/sbkb459w(v=vs.110).aspx
  • http://msdn.microsoft.com/en-us/library/53k8ybth(v=vs.110).aspx

And or course when you check your true value, you can use your if condition like;

if (checkBox5.Checked)
{
  // Do something if checkBox5 is checked.
}

And if you use semicolon after your if condition;

if (checkBox5.Checked = true) ;

is equivalent to

if (checkBox5.Checked = true) { }

So in your case I think you shouldn’t use semicolon either. Because if you use it, your code will be look like;

if (checkBox5.Checked = true)
{

}

Double value5 = Convert.ToDouble(checkBox4.Checked);
value5 = +1;
Double result5 = value5;
label2.Text = Convert.ToString(result5);

which I assume you don’t want to do this. And remember, even if there is no body to execute, doesn’t mean that the loop terminates.

answered Jan 26, 2013 at 11:41

Soner Gönül's user avatar

Soner GönülSoner Gönül

96k102 gold badges205 silver badges356 bronze badges

1

The problem is the semi-colon at the end of your if as well as the single ‘=’, should be:

if (checkBox5.Checked = true) ;

Should be:

if (checkBox5.Checked == true) // double '==' for equality comparison

answered Apr 5, 2013 at 19:50

Tom Studee's user avatar

Tom StudeeTom Studee

10.2k3 gold badges38 silver badges41 bronze badges

if (checkBox5.Checked == true) ; // or you can use if (checkBox5.Checked)
//                     ^------------------- `=` assignment operator must be `==` equals
{  // missed 
    Double value5 = Convert.ToDouble(checkBox4.Checked);
    value5 = +1;
//          ^_______________ I assume you need `=+` addition assignment operator instead
//                                     assigning `+1` to `value5 `
    Double result5 = value5;
    label2.Text = Convert.ToString(result5);
} /// missed 

answered Jan 26, 2013 at 11:47

Hamlet Hakobyan's user avatar

Hamlet HakobyanHamlet Hakobyan

32.7k6 gold badges51 silver badges68 bronze badges

In addition to @des and @Soner answers, why don’t you just do this :

if (checkBox5.Checked)

    label2.Text = Convert.ToDouble(checkBox5.Checked).ToString();

I’m assuming you don’t intend to increment value5 by 1 as it should be value5 += 1;

answered Jan 26, 2013 at 11:46

Abdusalam Ben Haj's user avatar

3

Не могу нормально использовать оператор else постоянно вылетают ошибки, не пойму, что я не правильно делаю.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _1PROGRAM
{
    class Program
    {
        static void Main(string[] args)
        {
            int b; string d; int e;
            Console.WriteLine("Число");
           d = Console.ReadLine();
           int a=  Convert.ToInt32(d);
            b = 10;
            e = a - b;
 
            if (a > b & a < 99) //основной оператор ИФ!!
            {
               if (e < 10) ; //Первый десяток!
                {
                    Console.WriteLine("1  " + e);                             
                }
                else
                { Console.Write("  "); }
               if (e > 10 & e < 21) ; //Второй десяток
                {
                    Console.WriteLine("2  " + e);
                 }
 }

erors:
Серьезность Код Описание Проект Файл Строка Состояние подавления Состояние подавления
Предупреждение CS0642 Возможно, ошибочный пустой оператор 1PROGRAM C:UsersDrewDesktopпроект с#1PROGRAM1PROGRAMProgram.cs 28 Активный
Предупреждение CS0642 Возможно, ошибочный пустой оператор 1PROGRAM C:UsersDrewDesktopпроект с#1PROGRAM1PROGRAMProgram.cs 22 Активный
Ошибка CS1002 Требуется «;». 1PROGRAM C:UsersDrewDesktopпроект с#1PROGRAM1PROGRAMProgram.cs 25 Активный
Ошибка CS1525 Недопустимый термин «else» в выражении 1PROGRAM C:UsersDrewDesktopпроект с#1PROGRAM1PROGRAMProgram.cs 25 Активный
Ошибка CS1026 Требуется «)» 1PROGRAM C:UsersDrewDesktopпроект с#1PROGRAM1PROGRAMProgram.cs 25 Активный
Ошибка CS1525 Недопустимый термин «else» в выражении 1PROGRAM C:UsersDrewDesktopпроект с#1PROGRAM1PROGRAMProgram.cs 25 Активный
Ошибка CS1003 Синтаксическая ошибка, требуется «(» 1PROGRAM C:UsersDrewDesktopпроект с#1PROGRAM1PROGRAMProgram.cs 25 Активный
Ошибка CS8641 «else» не может запускать оператор. 1PROGRAM C:UsersDrewDesktopпроект с#1PROGRAM1PROGRAMProgram.cs 25 Активный

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

На C # я могу написать что-то вроде:

using (new MyDisposableClass().MethodA());

Точка с запятой вызывает отображение предупреждения компилятора, в котором указывается возможный ошибочный пустой оператор. Я не запускал приведенный выше код, но разве метод не будет вызван?

Какое применение имеет этот тип соглашения о кодировании? Я видел здесь еще одну ветку об этом, но я спрашиваю, есть ли какие-то различия сейчас / поэтому разные ответы.

Благодарность

8 ответов

Лучший ответ

Этот код в основном переводится как

MyDisposableClass tmp = new MyDisposableClass().MethodA();
try
{
}
finally
{
    if( tmp != null )
        tmp.Dispose();
}

По сути, вы избавляетесь от результата вызова MethodA, а не от MyDisposableClass, что является вероятным намерением.

Знак ;, следующий за оператором using, является допустимым, но предупреждение предполагает, что вы могли добавить его туда по ошибке. Например, следующий код не компилируется:

using( var tmp = new MyDisposableClass() );
{
    tmp.MethodA();
}

Синтаксический анализатор оценивает два совершенно отдельных блока и воспринимается компилятором так, как если бы вы набрали это:

using( var tmp = new MyDispoableClass() )
{

}


{
    tmp.MethodA();
}

Оборванный ; легко пропустить на глаз, поэтому предупреждение компилятора просто указывает на то, что вы, вероятно, хотели сделать что-то еще. Бывают случаи, когда желательно более короткое краткое изложение, и я думаю, что лучший способ указать, что это сделано намеренно, — это использовать {} вместо ;.

using( new MyDisposableClass().MethodA() ){}

Обратите внимание, что это удаляет результат вызова MethodA, а не экземпляр MyDisposableClass. На самом деле ваш код должен быть написан как

using( var tmp = new MyDisposableClass() ){ tmp.MethodA(); }


11

Paul Alexander
20 Май 2010 в 02:23

Оператор using может использоваться в качестве открытия для предложения, в конце которого удаляется экземпляр объекта. Другими словами:

using (var foo = new bar())
{
  SomeStatments();
} 
//foo is disposed

Или

using (var foo = new bar())
  SomeStatments();
//foo is disposed

Ваша точка с запятой не заканчивает оператор using. Фактически он заканчивается пустым предложением, следующим за оператором using. Часто это не соответствует истинным намерениям программистов. Таким образом, компилятор выдает предупреждение «возможно ошибочный пустой оператор».

Обновление . Предполагая, что код, который вы указали в вопросе, является фактическим кодом, вам, вероятно, следует превратить MethodA в метод static, поскольку вы, очевидно, не применяете ограничение или не полагаетесь на любых учениках.


3

Abtin Forouzandeh
20 Май 2010 в 02:25

Зачем стараться быть умным?

Это должно быть одинаково, и будущим разработчикам не придется гуглить, что может означать более короткий синтаксис.

//By the name of the example, I can assume that MyDisposableClass 
//implements IDisposable
using (MyDisposableClass something = new MyDisposableClass())
{
   //Assuming the example code compiles, then the return value of MethodA
   //implemented IDisposable, too.
   using(something.MethodA())
   {

   };
}

И если вам нужно избавиться от чего-то после всего лишь одного вызова, почему бы не заставить MethodA очистить то, что когда-либо нужно было очистить?


2

MatthewMartin
21 Май 2010 в 01:13

Думаю, было бы понятнее написать вот что:

using (var myDisposable = new MyDisposableClass())
{
   myDisposable.MethodA();
}

Таким образом, результат MethodA фактически будет рассматриваться как реализация IDisposable.


1

Daniel Schaffer
20 Май 2010 в 02:23

Может, поможет этот образец:

public static class Helper {
    public static void Using<T>( Action<T> action ) where T : IDisposable, new() {
        var obj = new T();
        action( obj );
    }
}

// ...
Helper.Using<MyDisposableClass>( cls => cls.MethodA() );
Helper.Using<OtherClass>( cls => {
    for( int i = 0; i < 5; i++ ) { cls.DoRandom(); }
} );


0

TcKs
20 Май 2010 в 02:32

У вас может возникнуть соблазн использовать этот стиль. Он вызывает метод. Но это в лучшем случае идиома, которая скорее запутает следующего читателя — включая вас, через несколько месяцев, — чем просветит.

Даже заменив «;» с пустым блоком (что устраняет предупреждение компилятора) может привести к головной боли при чтении позже — и помните, что код читается чаще, чем он пишется.

Ответ Пола Александера правильный, но у меня недостаточно репутации, чтобы его комментировать.

Я использовал его в случае, когда меня просто интересовал побочный эффект исключения, генерируемого методом:

try {
    using (var _ = File.Open(logPath, FileMode.Open, FileAccess.Read)) { }
} catch (Exception ex) { ... }

File.Open возвращает FileStream, который необходимо закрыть или удалить. Но мне это не очень понравилось. В итоге я назвал переменную и поставил в блок явное закрытие. Я чувствовал, что позже будет легче понять.


0

davidbak
5 Янв 2014 в 04:36

Иногда предупреждения компилятора генерируются, но не удаляются, когда вы продолжаете печатать. Попробуйте найти решение и посмотрите, исчезнет ли оно.

Кроме того, я не уверен, о какой запятой вы имеете в виду. Вы имеете в виду точку с запятой в конце строки?


-1

dlras2
20 Май 2010 в 02:15

Этот метод по существу вызовет MethodA () и никогда не будет его использовать. «Использование» использует все, что указано в круглых скобках, только в этом конкретном блоке using. Затем это выходит за рамки. Так:

using (new MyDisposableClass().MethodA())
{
    //Code that uses MethodA()
}

… не должен выдавать эту ошибку, но MethodA () по-прежнему будет недоступен за пределами блока using.

Разъяснение:

Вы по-прежнему можете вызвать new MyDisposableClass().MethodA() где-нибудь в программе, но конкретный вызов, сделанный в коде using (new MyDisposableClass().MethodA()), выйдет за пределы области видимости и станет недоступным.


-2

Mike Webb
20 Май 2010 в 02:18

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Возможно не использует локатор айфон ошибка как настроить
  • Возможно ли как то изменить цвет глаз
  • Возможно ли вернуть деньги переведенные на карту сбербанка ошибочно
  • Возможно изменения конфигурации оборудования не обнаружены как исправить
  • Возможно днс сервер недоступен как исправить ростелеком

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии