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

C#中能否通过bool变量的扩展方法修改原值实现Toggle?

原因说明

首先纠正一个认知偏差:Swift中的Bool同样是值类型,它内置的toggle()能修改原值,是因为该方法被标记为mutating,会直接操作原变量的内存空间。
你的C#扩展方法不生效的核心原因是:值类型的普通扩展方法默认按值传参,方法内部操作的是原变量的拷贝,修改不会作用到原变量上。

最优实现(C# 7.2及以上版本支持)

使用ref修饰扩展方法的第一个参数,让参数按引用传递,就可以直接修改原变量的值,调用语法和Swift完全一致:

public static class BoolExtensions
{
    public static void Toggle(this ref bool variable)
    {
        variable = !variable;
    }
}

调用示例:

var isVisible = false;
isVisible.Toggle(); // 执行后isVisible值为true

注意:该写法仅支持对局部变量、类/结构体的可写字段调用,无法直接作用在属性、索引器的返回值上——因为这类成员返回的是临时值,没有固定内存地址可修改,这和Swift中mutating方法的限制一致。

兼容旧版本C#的方案

如果你的项目使用的C#版本低于7.2,不支持ref扩展方法,就无法实现和Swift完全一致的调用语法,只能通过普通ref方法实现功能:

public static class BoolUtilities
{
    public static void Toggle(ref bool variable)
    {
        variable = !variable;
    }
}

调用时需要显式传入ref关键字:

var isVisible = false;
BoolUtilities.Toggle(ref isVisible); // 执行后isVisible值为true

另外还有一种带返回值的扩展方法写法,不需要ref,但调用时必须手动赋值,和Swift的使用体验差距较大,仅作为补充参考:

public static bool Toggle(this bool value) => !value;

// 调用
var isVisible = false;
isVisible = isVisible.Toggle(); // 执行后值为true

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:06:04