我想使用?:
运算符而不是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
也无效。
有谁能告诉我一个解决方案?
答案 0 :(得分:3)
在您的情况下,只有if
条件更适合。
为了您的理解,三元运算符(?:
)需要在右侧生成一个值,并且还需要左侧的变量来分配结果值,例如:
x = (y== null) ? 0: 1;
这意味着0
在x
分配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
。
由此我们可以推断出一些事情:
y
和z
都必须返回某些内容(如果其中任何一个评估为void
,则无效),y
和z
必须评估为相同的类型。 (想象一下你有这样的事情: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结构。