你欺骗了我,可选参数必须位于所有参数最后
前言
有时候不得不感叹中国的文化确实是博大精深,你稍有不慎就会误入歧途,到最终迷茫过后,回过头来再看,哦 ,原来是这个意思,所以说每一字每一句都得仔细斟酌,为什么要这样说,请看我以为的!
话题
在控制台中写一个方法如下
1 static int OptionParam(int a = 0, int b, int c) 2 { 3 return a + b + c; 4 }
然后再控制台调用方法 Console.WriteLine(OptionParam(0, 1, 2)); 进行输入,很显然会告诉你错误:可选参数必须出现在所有必需的参数之后 ,那么进行修改如下
1 static int OptionParam(int b, int c, int a = 0) 2 { 3 return b + c + a; 4 }
然后再调用方法 Console.WriteLine(OptionParam(0, 1)); 明显会输出1,你以为这样这样就可以完了吗,你难道就不会多想一点,你这是可选参数(option parameter),如果我有个未知参数params(unknown params)两个结合会怎样呢??接下来代码修改如下:
1 static void OptionParam(int b, int c = 0, params int[] a) 2 { 3 Console.WriteLine(a.Length); 4 }
因为在该方法中c有默认值,而且我们知道我们在调用参数可以显示按照我们的意愿来调用参数,所以下面我们这样调用 OptionParam(0, a: 1, 2); 理论上是可以的,对吗,我也这样认为,结果却是
抛开这句话,你是不是心生疑惑可选参数和params是不是在一起就是个错误呢?这句话我想了想应该是里面传了三个参数进去,编译器认为你也指定了参数b即使你显示指定了参数a,所以不会通过!既然这样,a参数传一个是不是就对了呢,试试 OptionParam(0, a: 1); 果不其然,没有任何错误,运行正确!那么问题来了,我既然用的是params参数数组,肯定就是不确定我要传的参数的个数啊,现在你居然完全限制只能让我传一个参数进去,你闹呢,接着想办法,利用方法重载试试看看!代码如下:
1 static void OptionParam(int b, params int[] a) 2 { 3 Console.WriteLine(a.Length); 4 } 5 6 static void OptionParam(int b, int c = 0, params int[] a) 7 { 8 Console.WriteLine(a.Length); 9 }
然后再调用方法 OptionParam(0,1,3,4,4); 这样就巧妙的解决了问题,但是问题又来了,这样的话 可选参数和params就不能在一起使用 !这样就形成了一个恶性循环即 连在一起使用,params参数个数受限制!通过重载,两者又不能连在一起使用 ,当然我们回到问题的源头,现在是不是觉得题目标题是正确的,谁说 可选参数必须位于所有参数最后 ,上面情况不是明确验证了这点了吗!解决了这点,出现了新的问题,那我们继续解决,这不就是我们码农的精神,哈哈!不要灰心,难道真的不能再一起好好的玩耍吗,看看下面代码。
1 static void OptionParam(int b = 0, params int[] c) 2 { 3 Console.WriteLine(c.Length); 4 }
同样调用上述方法 OptionParam(0, 1, 3, 4, 4); 结果运行完全正确,上述那是因为在可选参数之前还有必须参数,导致无法直接结合在一起使用!所以问题总归还是有解决的办法的,事在人为!
反省
归根结底,可选参数必须位于所有参数最后,这话确确实实是错的,但是是自己欺骗了自己,出现错误时,编译器表述为:可选参数必须出现在所有必需的参数之后!是我解释为上述标题,通过了本文你就明确知道为什么要加必须的三个字,恰好就是为了可选参数和params非必须参数的完美邂逅擦出的火花,因此从中也能总结出一点人生道理:有些在你看来完全不起眼的地方,当你放眼长远,也许正是这些不起眼,才造就了更好的自己!
总结
【1】可选参数必须出现在所有必需的参数之后
【2】params参数必须出现在所有参数之后

为了方便大家在移动端也能看到我分享的博文,现已注册个人公众号,扫描上方左边二维码即可,欢迎大家关注,有时间会及时分享相关技术博文。
感谢花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让楼主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/CreateMyself)/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?