2015-04-07 2 views
-5

Я хочу проверить, существует ли файл, если он ничего не делает, если он не копирует файл. Это код, у меня есть, но я получаю ошибку компиляции, такие какЕсли File.Exists = True Do Nothing Else Copy

Only assignment, call increment, decrement and new object expressions can be used as a statement 
Invalid expression return 
Invalid expression term ':' 
; Expected 

Это синтаксис у меня

string template = "C:\\Test\\database12.mdb"; 
string dest = "R:\\Production\\database12.mdb"; 
if (File.Exists(dest) ? return : File.Copy(template, dest)); 
+0

Почему вы пытаетесь использовать условный оператор здесь в первую очередь? Очевидно, что ваши требования не соответствуют тому, что он делает вообще, поэтому не используйте его. – Servy

+2

'if (! File.Exists (dest)) {File.Copy (template, dest)}'. – zzzzBov

+0

Обратите внимание, как правильный пример кода с помощью @zzzzBov в основном представляет собой прямой перевод первого предложения вашего вопроса :) – CompuChip

ответ

2

Условный оператор (? :) является оператора, который возвращает значение и не может использоваться для управления потоком программы. Используйте стандартный если-то еще вместо:

if (File.Exists(dest)) 
    return; 
else 
    File.Copy(template, dest); 

Что может быть упрощена:

if (File.Exists(dest)) 
    return; 

File.Copy(template, dest); 

или просто

if (!File.Exists(dest)) 
    File.Copy(template, dest); 

предполагающей нет ничего после копирования файла.

+0

Условный оператор * разработан * для потока управления, только для другого типа потока управления, чем требуется OP. – Servy

-1

Условный оператор

var result = x ? y : z; 

можно рассматривать в качестве ярлыка на что-то вроде

T result; 
if (x) 
    result = y; 
else 
    result = z; 

с T быть типом как y и z. Это ясно показывает, что y и z должны решить значений (а не заявления) в же типа так весь оператор имеет последовательный тип.

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

Таким образом, хотя это нормально писать

var value = condition ? func1() : func2(someValue); 

пока func1 и func2 являются методы, возвращающие значения одного и того же типа, что это не нормально, чтобы написать

var value = condition ? return : null; 

return не и вы не можете использовать return как один из операндов в условном операторе. Вы не можете даже сделать это:

var value = condition ? return true : false; 

Вы даже могли бы сделать что-то вроде этого:

if ((File.Exists(dest) ? CalcFileSize(dest) : 0) > 0) 
{ 
    // Do something if the file exists and it has content 
} 

Это гораздо проще (и правильно) в этом случае просто использовать старый добрый if:

if (File.Exists(dest)) 
    return; 
File.Copy(template, dest); 
+0

* условный * оператор * не * ограничен только назначением. Он может использоваться везде, где выражение может быть разрешено к значению. Второй операнд выражения присваивания является одним из многих таких мест. – Servy

+0

Вы можете смешать 'if' и * условный * opeartor, если хотите:' if (Foo()? CheckA(): CheckB()) DoWork(); 'Проблема с его использованием условного оператора не имеет ничего общего делать с блоком 'if'. Проблемы с его кодом выражаются прямо в ошибках, которые он получает. – Servy

+0

Ваше описание того, что он делает неправильно, на самом деле ничего не делает, чтобы объяснить, что он делает неправильно. Он знает, что код, который у него есть, не будет работать, потому что * он попробовал его, и он не работал * (и отправил сообщение об ошибке, чтобы объяснить, почему он не будет работать). Говорить ему, что это не сработает, никоим образом не полезно. – Servy

1

Вы используете Conditional Operator, чтобы указать поведение then/else, которое недопустимо.

Оператор ?: предназначен для получения значения в зависимости от bool. Таким образом, вы должны получить объект frm пару параметров с одним и тем же типом.

Если вы хотите логика расшириться, вы должны использовать if заявление, то synatx, для которого является

if(condition) 
{ 
    // Do true stuff here 
} 
else 
{ 
    // Do false stuff here 
}