c# - 在 out 参数中使用未分配的局部变量

我在 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'
}

回答1

我认为这可能是编译器中的一个错误——我个人希望 b2 肯定会被分配到那里。不过,明确分配的规范非常复杂,所以我现在不打算以一种或另一种方式证明它。规则可能不够“聪明”,无法确定 (x && y) 为真的唯一方法是是否同时评估 xy,因此在 (x && y) && z 中,z 应该是能够依赖已评估的 xy

但是,它很容易解决,只需多加一对括号:

var resultB =
        Func1(0, out var b1) &&
        (Func1(b1, out var b2) && Func1(b2, out var b3));

相似文章

随机推荐

最新文章