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

推荐答案

我认为这可能是编译器中的一个错误——我个人认为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));

Csharp相关问答推荐

C#中的包版本控制

一种安全的方式来存储SSH凭证(MAUI/C#应用程序)

`Task`只有在C#中等待时才会运行吗?

(乌龙)1&#比c#中的UL&#慢吗?

Quartz调度程序不调用作业(job)类

注册所有IMediatR类

在允许溢出的情况下将小数转换为长

为什么Regex.IsMatch(";\\t";,";\\t";)返回FALSE而不是TRUE?

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

取决于您的数据量的多个嵌套循环

如何在Cosmos SDK中控制超时、重试和重试之间的延迟?

带有可选参数的模拟方法返回意外的不同值,具体取决于可选的默认值

如何返回具有泛型的类?

获取混淆&Quot;模糊引用&Quot;错误

System.NotSupportdException:流不支持读取

C# Winforms:从对象树到TreeView的递归转换重复条目

在Visual Studio 2022中查找Xamarin模板时遇到问题

如何对正方形格线进行对角分组

从具有泛型类型约束的类继承-Blazor

我应该使用IMhemyCache来存储承载令牌,还是应该为Azure函数中的401个错误实施Polly重试策略?