?:操作员返回无效

时间:2012-11-04 07:58:25

标签: c# .net operators

我想使用?:运算符而不是if else

e.g。

var directory = new DirectoryInfo(path);
if (!directory.Exist())
{
    directory.Create();
}
else 
{
    // do nothing
}

我试图像这样使用?:

var directory = new DirectoryInfo(path);
!directory.Exist() ? directory.Create() : void;

但它说“表达式字词void无效”,null也无效。

有谁能告诉我一个解决方案?

7 个答案:

答案 0 :(得分:3)

在您的情况下,只有if条件更适合。

为了您的理解,三元运算符(?:)需要在右侧生成一个值,并且还需要左侧的变量来分配结果值,例如:

    x =  (y== null) ? 0: 1;

这意味着0x分配y is null时将1分配给 var newDirectoryCreated = (!directory.Exist()) ? directory.Create() : false;

因此,在您的示例/场景中,您可以编写类似这样的内容,以产生如下目录创建状态:

newDirectoryCreated

这样,如果创建了新目录,那么true将被分配false,否则{{1}}。

答案 1 :(得分:2)

只需保留if语句并删除else条款,因为您没有在那里做任何事情。

您正在尝试使用ternary operator,根据定义,必须返回一个值。

来自文档:

  

条件运算符(?:)根据布尔表达式的值返回两个值中的一个。

答案 2 :(得分:2)

三元运算符并非旨在替换if/else 它们是为了简化赋值和声明。它应该能够将语句的结果赋值给变量或函数。主要用途是分配或阅读。

这样的东西
var status = !directory.Exist() ? directory.Create() : false;

正确的解决方案是坚持原生if条件。以下就足够了:

var directory = new DirectoryInfo(path);
if (!directory.Exist())
{
    directory.Create();
}

答案 3 :(得分:2)

如果你只是寻求简洁,你可以试试这个:

if (!directory.Exist())
    directory.Create();

答案 4 :(得分:1)

conditional operator(?:)必须返回两个值中的一个,具体取决于布尔表达式的值。所以你可以坚持使用if子句,它仍然很容易理解而不是条件运算符:

var directory = new DirectoryInfo(path);
if (!directory.Exist()) directory.Create();

答案 5 :(得分:1)

?:运算符的行为大致如下:

对于x ? y : z,如果y为真,则返回x,否则返回z

由此我们可以推断出一些事情:

  • yz都必须返回某些内容(如果其中任何一个评估为void,则无效),
  • yz必须评估为相同的类型。 (想象一下你有这样的事情:var r = x ? y : z;。哪种类型是r?它是y还是z的类型?我们不知道哪些会被退回,但我们必须在编译时选择一个类型。所以他们必须返回相同的类型。

在您的情况下,两者都评估为void,这不起作用。 (如果您将最后一部分更改为null,正如您所说的那样,那么他们会评估不同的类型,其中一个是无效的,这会破坏两个规则)

答案 6 :(得分:0)

?:运算符是if-then-else结构的扩展。

扩展位于then-block和else-block中。如果then-block和else-block为if-then-else构造返回void,则它必须为?:运算符返回一个类型。对于?:运算符中类型的附加约束是两种类型必须相同。由于编译器将使用自动转换使这两种类型相同,因此这种约束有所缓和。

使用?:运算符的代码通常较短但也难以阅读。在使用?:运算符替换if-then-else构造时,需要考虑这一点。除非你的then-block和else-block是一个衬里,否则很少值得用?:运算符替换它。

if-then构造是if-then-else构造的有限版本(反之亦然,if-then-else构造是if-then构造的扩展)。由于if-then结构只有一个代码块,即then-block,因此不可能用?:运算符替换if-then结构。首先必须使用空的else块扩展if-then构造。

示例:

// initialising an integer with an if-then construct.
int x = 0;
if (some_condition)
{
    x = 1;
}

将此想象为then-block返回一个整数。 无法使用?:操作员海峡。

// initialising an integer with an if-then-else construct.
int y;
if (some_condition)
{
    y = 1;
}
else
{
    y = 0;
}

将if-then结构扩展为if-then-else结构,并将then-block和else-block视为为类型返回一个整数;-)相互匹配。 在这种情况下可以使用?:运算符。

// initialising an integer with a ?: operator.
int z = (some_condition) ? 1 : 0;

关于您的代码:

var directory = new DirectoryInfo(path);
if (!directory.Exist())
{
    directory.Create();
}

在这种情况下,我没有看到一种合理的方法来使then-block返回一个值。这使得使用?:运算符变得不可能或者因此使用丑陋的代码而非常复杂。我建议,在这种情况下坚持使用if-then结构。