0

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

例如

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也不起作用。

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

4

7 回答 7

3

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

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

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

这意味着分配0xy is null否则分配1

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

    var newDirectoryCreated = (!directory.Exist()) ? directory.Create() : false;

这样,如果创建了新目录,则将newDirectoryCreated分配else 。truefalse

于 2012-11-04T08:00:11.920 回答
2

三元运算符不是为了替换而设计的,if/else它们是为了简化赋值和声明。它应该能够将语句的结果分配给变量或函数之类的东西。主要用于作业或阅读。

就像是

var status = !directory.Exist() ? directory.Create() : false;

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

var directory = new DirectoryInfo(path);
if (!directory.Exist())
{
    directory.Create();
}
于 2012-11-04T08:01:41.327 回答
2

如果你只是为了简洁,你可以试试这个:

if (!directory.Exist())
    directory.Create();
于 2012-11-04T08:04:33.507 回答
2

只需保留该if声明并删除该else分类,因为您没有在其中做任何事情。

您正在尝试使用三元运算符,根据定义,它必须返回一个值。

从文档中:

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

于 2012-11-04T07:59:41.977 回答
1

运营商的?:行为大致是这样的:

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

由此我们可以推断出几件事:

  • 两者都y必须z返回一些东西(如果它们中的任何一个评估为 ,它将不起作用void),并且
  • y并且z必须评估为相同的类型。(想象一下你有这样的东西:var r = x ? y : z;. 哪个类型是 r?它是yor的类型z吗?我们不知道它们中的哪一个会被返回,但我们必须在编译时选择一个类型。所以它们必须返回同一类型。

在您的情况下,两者都评估为void,这是行不通的。(如果您将最后一部分更改为null,如您所说,您已经尝试过,那么它们会评估为不同的类型,其中一种是无效的,这违反了两个规则)

于 2012-11-04T08:05:21.090 回答
1

条件运算符(?:) 必须根据布尔表达式的值返回两个值之一。所以你可以坚持使用if从句,它仍然很容易理解而不是条件运算符:

var directory = new DirectoryInfo(path);
if (!directory.Exist()) directory.Create();
于 2012-11-04T08:00:43.283 回答
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 块返回一个整数。不能使用 ?: 运算符。

// 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 构造。

于 2012-11-04T12:29:09.427 回答