我在使用 C# 时遇到问题,给出“使用未分配的局部变量”编译错误。我缺少什么?
// returns generic result of a function with error message
// why the function failed
public class Result
{
public bool isSuccess = true;
public string errorMessage = string.Empty;
public static implicit operator bool(Result r)
{
return r.isSuccess;
}
public static Result operator &(Result a, Result b)
{
return !a.isSuccess ? a : b;
}
public static Result operator |(Result a, Result b)
{
if (a.isSuccess)
{
return a;
}
if (b.isSuccess)
{
return b;
}
return new Result
{
isSuccess = false,
errorMessage = $"{a.errorMessage}\nOut{b.errorMessage}"
};
}
public static bool operator false(Result a)
{
return !a.isSuccess;
}
public static bool operator true(Result a)
{
return a.isSuccess;
}
}
static Result Func1(int nIn, out int nOut)
{
nOut = nIn + 1;
return new Result();
}
private static void Main(string[] args)
{
var resultA =
Func1(0, out var a1) &&
Func1(a1, out var a2); // compiles fine
var resultB =
Func1(0, out var b1) &&
Func1(b1, out var b2) &&
Func1(b2, out var b3); // Use of unassigned local variable 'b2'
}
Run Code Online (Sandbox Code Playgroud)
我认为这可能是编译器中的一个错误 - 我个人希望b2肯定会在那里分配。不过,明确分配的规范相当复杂,所以我现在不打算尝试以这种或那种方式证明它。这些规则可能不够“聪明”,无法确定唯一(x && y)正确的方法是同时对x和y进行求值,因此在 中(x && y) && z,z应该能够依赖于对 和x进行y求值。
然而,解决起来相当容易,只需要一对额外的括号:
var resultB =
Func1(0, out var b1) &&
(Func1(b1, out var b2) && Func1(b2, out var b3));
Run Code Online (Sandbox Code Playgroud)