C# 短路不工作

C# 短路不工作,c#,short-circuiting,C#,Short Circuiting,据我所知,C#条件运算符执行短路。但是,我的程序在运行此代码时引发异常。索引等于-1,所以第二个条件永远不应该执行,但我得到了一个索引越界异常 if (index != -1 || pieces[index].Type != PieceType.Rook) { allowed = false; } 这是因为您使用OR运算符。第一个条件为false,所以第二个条件开始计算。这是因为您使用了OR运算符。第一个条件为false,所以第二个条件开始计算。您应该有索引!=1&&… 另外,是索引=

据我所知,C#条件运算符执行短路。但是,我的程序在运行此代码时引发异常。索引等于-1,所以第二个条件永远不应该执行,但我得到了一个索引越界异常

if (index != -1 || pieces[index].Type != PieceType.Rook)
{
    allowed = false;
}

这是因为您使用OR运算符。第一个条件为false,所以第二个条件开始计算。

这是因为您使用了OR运算符。第一个条件为false,所以第二个条件开始计算。

您应该有
索引!=1&&…


另外,是
索引
<1
还是
>=件。长度

您应该有
索引!=1&&…


另外,是
索引
<1
还是
>=件。长度

|
替换为
&

if (index != -1 && pieces[index].Type != PieceType.Rook)

否则,如果第一个密码为false,则会计算第二个密码。您希望两个条件都是
真的
,尤其是第一个条件。

|
替换为
&&

if (index != -1 && pieces[index].Type != PieceType.Rook)

否则,如果第一个密码为false,则会计算第二个密码。您希望两个条件都是
true
,尤其是第一个条件。

您已经使用了| |因此,当第一个条件失败(索引为-1)时,运行时需要检查第二个条件,然后再将代码从执行中排除,这将触发异常

相反,如果仅当这两个条件为真时才想输入if,则使用&(AND)。
通过这种方式,与以前一样,运行时检查第一个条件,现在得到的假结果足以决定不需要检查第二个条件

if (index != -1 && pieces[index].Type != PieceType.Rook)
{
    allowed = false;
}

您使用了| |,因此当第一个条件失败(索引为-1)时,运行时需要在排除代码执行之前检查第二个条件,这将触发异常

相反,如果仅当这两个条件为真时才想输入if,则使用&(AND)。
通过这种方式,与以前一样,运行时检查第一个条件,现在得到的假结果足以决定不需要检查第二个条件

if (index != -1 && pieces[index].Type != PieceType.Rook)
{
    allowed = false;
}

|
在发现某些内容为真时将停止计算。自<代码>索引!=-1
为false,它将计算表达式的两侧。如果您
&&
,它将在发现错误时停止。我建议你仔细阅读一下

|
将在发现某些内容为真时停止计算。自<代码>索引!=-1
为false,它将计算表达式的两侧。如果您
&&
,它将在发现错误时停止。我建议你仔细阅读一下

你想要&&,而不是| |(如果(第一个条件和第二个条件)你想要&,而不是| |(如果(第一个条件和第二个条件)那将不起作用,因为那样它将总是给出一个超出范围的索引。数组不从-1开始。@Emrys90,我认为你需要刷新这些基础知识。这是说
if(索引不等于-1,索引处的碎片不是车)
。如果索引为-1,它将短路并且不检查第二个面,整个表达式已经为false。这就是我想要的。如果索引不是-1并且元素不是Rook,我想让它执行If的主体。如果索引是-1,我想让它跳过该语句。@Emrys90想一想。如果索引是-1,会发生什么第一个表达式(
索引!=-1
)变成
false
,它会短路,它不会计算第二个表达式。@Antonijn哇。我不敢相信我错过了。我的大脑一定还没有清醒。谢谢。那不起作用,因为那样它总是会给出一个超出范围的索引。数组不是从-1开始的。@Emrys90,我想你需要刷新这些基础知识。这表示
if(索引不等于-1,索引处的碎片不是rook)
。如果索引为-1,它将短路并且不检查第二个面,整个表达式已经为false。这就是我想要的。如果索引不是-1并且元素不是Rook,我想让它执行If的主体。如果索引是-1,我想让它跳过该语句。@Emrys90想一想。如果索引是-1,会发生什么第一个表达式(
index!=-1
)变为
false
,它会短路,不会对第二个表达式求值。@Antonijn哇。我不敢相信我错过了。我的大脑一定还没有清醒。谢谢。