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

C#中为SavePhoneInfo方法extensionNumber设默认值的位置及参数传递顺序问询

问题解答

嘿,这个问题我刚好熟,给你掰扯清楚:

一、extensionNumber参数的位置

你需要把带默认值的extensionNumber参数放在**out string msg之前,同时要移到所有无默认值的必选参数(也就是isActive、userID)之后**。

为啥不能直接在原来的位置加默认值?因为C#有个硬性规则:带有默认值的可选参数必须排在所有无默认值的必选参数后面。你原来的参数列表里,extensionNumber后面的isActive、userID都是没有默认值的必选参数,如果直接给extensionNumber加默认值,编译器会直接报错。

调整后的代码大概是这样的:

public static bool SavePhoneInfo(int applicantId, string phoneType, string phoneNumber, bool isActive, int userID, string extensionNumber = "", out string msg) { 
    DataAccess dal = new DataAccess(); 
    // 注意这里要同步调整内部调用dal.SavePhoneInfo的参数顺序,确保参数对应正确
    return dal.SavePhoneInfo(applicantId, phoneType, phoneNumber, extensionNumber, isActive, userID, out msg); 
}

二、C#参数传递的顺序规则

总结成几条好记的规则,都是编译器强制执行或业界公认的最佳实践:

  • 必选参数排最前:所有没有默认值的参数(普通值参数、ref参数)必须放在列表最开头,调用时必须显式传值,不能省略。
  • 可选参数跟在后:带默认值的参数必须放在所有必选参数之后,调用时可以省略,直接用默认值;如果要传自定义值,用位置或命名参数都可以。
  • out/ref参数放最后:out和ref参数不能设默认值,而且必须显式传递。语法上它们可以放在可选参数之前,但那样调用时如果想使用可选参数的默认值,必须用命名参数,会让代码可读性变差,所以业界都默认把它们放在最后。

另外提一句:用命名参数可以打破位置限制,但除非特殊场景,不然还是遵循上面的顺序更符合编码习惯,团队协作也更顺畅。

内容的提问来源于stack exchange,提问作者mohammad mazharul hoque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:57:54