我有一些需要在for循环中分配的变量。显然,当循环退出时,C#忽略那里发生的任何事情,并且变量返回到其原始状态。具体来说,我需要它们作为List的最后一个和倒数第二个元素。这是代码:
int temp1, temp2;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
}
}
// At this point, temp1 and temp2 are treated as uninitialized
注意:没关系坏变量名称,它们实际上是临时变量。任何更复杂的事情都会让事情变得混乱。
现在,有两种方法(我知道)可以解决这个问题:一种是在循环退出后弄清楚如何使变量生效,另一种是在Python中做一些事情,你可以做{{{ 1}}获取列表的最后一个元素。在C#中是否有任何这些可能?
编辑:当我尝试编译时,我得到“使用未分配的局部变量'temp1'”错误。这段代码甚至没有运行,它只是坐在一个永远不会被调用的方法中。如果这有帮助,我试图在另一个循环中使用变量。
答案 0 :(得分:11)
为什么不做......
int temp1 = 0;
int temp2 = 0;
if (toReturn.Count > 1)
temp1 = toReturn[toReturn.Count - 2];
if (toReturn.Count > 0)
temp2 = toReturn[toReturn.Count - 1];
答案 1 :(得分:5)
如果toReturn.Count为0,则循环永远不会运行,temp1和temp2永远不会被初始化。
答案 2 :(得分:1)
这是做什么的?
if (toReturn.Count > 1) {
temp1 = toReturn[toReturn.Count - 2]
temp2 = toReturn[toReturn.Count - 1]
}
答案 3 :(得分:0)
尝试给temp1和temp2一个初始值,即0或任何合适的值,因为它们可能永远不会被初始化
答案 4 :(得分:0)
int temp1 = 0; // Or some other value. Perhaps -1 is appropriate.
int temp2 = 0;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
}
}
在尝试读取其值之前,编译器要求temp1
和temp2
明确分配。编译器不知道你的for循环会分配变量。它不知道for循环是否一直运行。它也不知道您的if条件是否为true
。
上述代码可确保temp1
和temp2
已分配给某些内容。如果您想确定是否已在循环中为temp1
和temp2
分配,请考虑跟踪此事:
int temp1 = 0;
int temp2 = 0;
bool temp1Assigned = false;
bool temp2Assigned = false;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
temp1Assigned = true;
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
temp2Assigned = true;
}
}
答案 5 :(得分:0)
如果您想要默认值:
int count = toReturn.Count;
int temp1 = count > 1 ? toReturn[count - 2] : 0;
int temp2 = count > 0 ? toReturn[count - 1] : 0;
如果您不关心默认值并且之前有计数检查:
int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];