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
相关产品推荐
相关产品推荐

