string returnString;
switch(Type) {
case 0: returnString = exampleFunction(foo0, out int exitCode); break;
case 1: returnString = exampleFunction(foo1, out int exitCode); break;
case 2: returnString = exampleFunction(foo2, out int exitCode); break;
}
当我编写这段代码时,VS向我显示了一个错误:'在这个范围内已经为第4行和第5行定义了一个名为'exitCode'的本地变量或名为'exitCode'的函数。所以如果我想得到两个以上的变量来自exampleFunction
的不同类型,我该怎么办?如果我无法在代码中使用out
,我是否应该使用元组从函数中获取returnString
和exitCode
?
答案 0 :(得分:8)
您可以在exitCode
之前声明switch
变量。您应该使用某个值对其进行初始化,或者在default
中使用switch
分支。否则,exitCode
之后会有switch
未初始化的流程。编译器不会通过这个。另外,请不要忘记每个break
后的case
:
int exitCode = 0;
string returnString;
switch(Type) {
case 0: returnString = exampleFunction(foo0, out exitCode); break;
case 1: returnString = exampleFunction(foo1, out exitCode); break;
case 2: returnString = exampleFunction(foo2, out exitCode); break;
}
但是整体上有一个方法返回两个不同的值(一个作为返回值,第二个作为out参数)是一个不好的做法。考虑使用一些简单的类将这些值作为属性:
class SomeValue
{
public string Foo { get; set; }
public int Code { get; set; }
}
static SomeValue ExampleFunction(string input)
{
return new SomeValue
{
Foo = input,
Code = 1,
};
}
static void Main(string[] args)
{
// ...
SomeValue val = null;
switch (Type)
{
case 0: val = ExampleFunction(foo0); break;
case 1: val = ExampleFunction(foo1); break;
case 2: val = ExampleFunction(foo2); break;
}
}
答案 1 :(得分:0)
您可以考虑使用数组,而不是声明foo0
,foo1
和foo2
。 foo[]
。每当你看到带有这样的升序数字的变量名时,这通常是一个好主意。
如果你这样做,问题就会消失,你的代码很多更短:
var returnString = exampleFunction(foo[Type], out int exitCode);
如果在foo0
,foo1
和foo2
的问题域中没有意义生活在一个数组中(例如,他们的个人姓名很重要),你仍然可以使用临时数组作为地图:
var returnString = exampleFunction(
new[] {foo0, foo1, foo2} [Type],
out int exitCode
);
答案 2 :(得分:0)
您应该首次声明“exitCode”
.on()
一旦声明它为“inline”,它就成为该块的局部变量。