Why not just use named parameters at the call site instead?
DoSomething(thing, logging: true); DoSomething(thing, logging: true);Another thing to consider: In some cases, it may make more sense to split the function into two versions, one for 'true' and one for 'false'. Then you gain the enforced explicitness. The function could call a private method to share code and pass the Boolean. Clearly that isn't ideal for all situations, but it might help in some situations today.
The author describes exactly this approach and implementation, under the heading "Distinct functions".
Required parameters as positional, and optional as named.
doSomething(req_param_1_value, req_param_2_value, optional_param_1 : value, optional_param2: value);