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
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
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ü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 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 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
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
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
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ü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 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 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
3
Не могу нормально использовать оператор else постоянно вылетают ошибки, не пойму, что я не правильно делаю.
| C# | ||
|
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
