You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中模拟Rust的Result返回模式(?运算符行为)

在C#中复刻Rust Result的?运算符错误返回逻辑

Rust的Result类型自带?运算符,当值为Error时会直接携带错误返回当前方法。我希望在C#中实现完全相同的行为。

我已经通过抽象Result<T>类实现了Rust的Result模式,该类可表示Ok<T>或Error<T>两种状态,借此实现了无null编程(仅处理外部依赖时例外),错误处理性能优于try-catch,还支持链式调用。

但核心问题在于,每次获取Result对象后都要编写冗长的判断代码:

if (playlistResult is not Ok<Playlist> playlist)
{
    if (playlistResult is Error<Playlist> error)
    {
        _log.Error(error.Exception, "Error when loading playlist.");
        return Result<Playlist>.Failed("Error when loading playlist.", error.Exception);
    }
    // 编译器通过的安全兜底逻辑
    _log.Error("Unexpected error when loading playlist.");
    return Result<Playlist>.Failed("Unexpected error when loading playlist.");
}
// 后续可直接使用playlist变量

即便精简后仍需两行:

if (playlistResult is not Ok<Playlist> playlist)    
    return Result<Playlist>.Failed("Unexpected error when loading playlist.");

这仍然不够简洁,而Rust中只需一行:

let playlist = getPlaylist()?; // 问号自动实现错误返回逻辑

若getPlaylist()返回Error,它会直接携带错误返回当前方法。

我知道可以通过扩展方法、静态方法实现很多功能,但不清楚如何实现这种直接返回方法的逻辑——能想到的只有宏,但C#并不支持宏。

我期望实现类似以下的简化写法:

Ok<Playlist> playlist = playlistResult as Ok<Playlist> ?? return Result<Playlist>.Failed("Unexpected error when loading playlist.");
// 或者
Ok<Playlist> playlist = playlistResult.ReturnIfError("Error when loading playlist.");

补充说明

很多人误解了我的需求:我已经实现了Result模式,问题在于模式匹配失败时的返回模式如何简化。

以下是我实现的Result<T>基础代码(已移除大量辅助方法):

public abstract class Result<T>
{
    public static Result<T> Success([DisallowNull] T value) =>
        value is null
            ? new Error<T>(new Exception("Value was null!"))
            : new Ok<T>(value);

    public static Result<T> Failed([DisallowNull] Exception error) =>
        new Error<T>(error);
 }

public sealed class Ok<T> : Result<T>
{
    [NotNull]
    public T Value { get; }

    internal Ok([DisallowNull] T value) =>
        Value = value;
}

public sealed class Error<T> : Result<T>
{
    public Exception Exception { get; }

    internal Error([DisallowNull] Exception error) =>
        Exception = error;
}

内容的提问来源于stack exchange,提问作者Gregor A. Lamche

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:53:23