【问题标题】:If File.Exists = True Do Nothing Else Copy [duplicate]如果 File.Exists = True 什么都不做其他复制 [重复]
【发布时间】:2015-06-12 13:13:31
【问题描述】:

我想检查一个文件是否存在,如果它没有复制一个文件,它是否什么都不做。这是我的代码,但我得到编译错误,例如

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));

【问题讨论】:

  • 你为什么要在这里首先使用条件运算符?显然,您的要求与它的功能完全不符,所以不要使用它。
  • if (!File.Exists(dest)) { File.Copy(template, dest) }.
  • 请注意@zzzzBov 的正确代码示例基本上是您问题第一句话的直接翻译:)

标签: c#


【解决方案1】:

条件运算符(? :)是一个返回值的运算符,不能用于控制程序流。改用标准的 if-else:

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);

假设文件复制后什么都没有。

【讨论】:

  • 条件运算符设计用于控制流,只是与 OP 想要的不同类型的控制流。
【解决方案2】:

您正在使用 Conditional Operator 指定 then/else 行为,这是无效的。

?: 运算符用于根据布尔值获取值。因此,您应该从一对具有相同类型的选项中获取一个对象。

当你想让 logic 分支时,你需要使用if 语句,其语法是

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

【讨论】:

    【解决方案3】:

    条件运算符

    var result = x ? y : z;
    

    可以看作是类似的快捷方式

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

    Tyz 的类型。这清楚地表明yz 必须解析为相同类型(而不是语句),因此整个语句具有一致的类型。

    这也清楚地表明,您不能简单地对yz 使用任何方法调用,而只能使用导致相同类型的方法调用。

    所以虽然可以写

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

    只要func1func2是返回相同类型的方法,就不能写了

    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);
    

    【讨论】:

    • 条件运算符仅限于赋值。它可以在任何可以将表达式解析为值的地方使用。赋值表达式的第二个操作数是许多这样的地方之一。
    • 你可以混合if条件操作符,如果你愿意的话:if(Foo() ? CheckA() : CheckB()) DoWork();他使用条件运算符的问题与@987654342无关@ 堵塞。他的代码的问题直接体现在他遇到的错误中。
    • 你对他做错了什么的描述实际上并没有做任何事情来解释他做错了什么。他知道他拥有的代码将无法工作,因为他尝试过但没有成功(并发布了错误消息以解释为什么它无法工作)。告诉他这行不通是没有任何帮助的。
    • @Savy 希望这是您想要阅读的更多内容。抱歉,我花了一些时间才先启动我的机器。
    • 您对映射的描述虽然朝着正确的方向发展,但仍然具有误导性。您在翻译中使用return 实际上并不是一个类似的代码 sn-p,而且考虑到他的 problem 在条件操作中使用return(这就是本质上不会工作)。相反,表示条件运算符的表达式的结果解析为第二个或第三个操作数(基于第一个操作数的值),这与您显示的实际语法明显不同。
    猜你喜欢
    • 2020-04-23
    • 2016-03-31
    • 1970-01-01
    • 2016-05-07
    • 2019-08-16
    • 2017-06-30
    • 2010-10-24
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多