你欺骗了我,可选参数必须位于所有参数最后

简介:

前言

有时候不得不感叹中国的文化确实是博大精深,你稍有不慎就会误入歧途,到最终迷茫过后,回过头来再看,哦 ,原来是这个意思,所以说每一字每一句都得仔细斟酌,为什么要这样说,请看我以为的!

话题

在控制台中写一个方法如下

1       static int OptionParam(int a = 0, int b, int c)
2         {
3             return a + b + c;
4         }

然后再控制台调用方法  Console.WriteLine(OptionParam(012)); 进行输入,很显然会告诉你错误:可选参数必须出现在所有必需的参数之后 ,那么进行修改如下

 

1       static int OptionParam(int b, int c, int a = 0)
2         {
3             return b + c + a;
4         }

 

然后再调用方法  Console.WriteLine(OptionParam(01)); 明显会输出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: 12); 理论上是可以的,对吗,我也这样认为,结果却是

抛开这句话,你是不是心生疑惑可选参数和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(01344); 结果运行完全正确,上述那是因为在可选参数之前还有必须参数,导致无法直接结合在一起使用!所以问题总归还是有解决的办法的,事在人为!

反省

归根结底,可选参数必须位于所有参数最后,这话确确实实是错的,但是是自己欺骗了自己,出现错误时,编译器表述为:可选参数必须出现在所有必需的参数之后!是我解释为上述标题,通过了本文你就明确知道为什么要加必须的三个字,恰好就是为了可选参数和params非必须参数的完美邂逅擦出的火花,因此从中也能总结出一点人生道理:有些在你看来完全不起眼的地方,当你放眼长远,也许正是这些不起眼,才造就了更好的自己!

总结

  【1】可选参数必须出现在所有必需的参数之后

  【2】params参数必须出现在所有参数之后








本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/4685105.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
算法 网络性能优化
网络中窗口的含义及作用
【8月更文挑战第24天】
28 0
|
5月前
“无任何网络提供程序接受指定的网络路径”问题的几个解决方法
“无任何网络提供程序接受指定的网络路径”问题的几个解决方法
77 1
|
5月前
|
边缘计算 安全 网络安全
隐藏服务器源IP怎么操作?
一篇文章看懂隐藏源IP!
134 0
|
XML JSON API
请求体中的参数通常是通过"&"符号进行连接的
请求体中的参数通常是通过"&"符号进行连接的
91 1
|
网络协议 应用服务中间件 网络安全
限定源端口访问目标
限定源端口访问目标 1.1. 起因 在渗透测试时,客户需要对我们的测试IP进行加白,但是此次客户要求精确到固定端口或者小范围端口(不能1-65535),根据以前的经验,默认是加白IP和全端口,因为代理建立连接使用的端口是随机的,所以这次算是从头查找资料总结一下各种指定源端口的方式。 这里的端口是指与目标建立连接时使用的源端口,而不是代理监听的端口。 1.2. 注意 最
6577 1
|
PyTorch 算法框架/工具
如何将网络参数初始化,或者如何将网络参数还原成原始参数状态
在以上代码中,_initialize_weights()方法用于对网络参数进行初始化。其中,init.ones_表示将权重初始化为1,init.zeros_表示将偏置初始化为0。 3. 如果想将网络参数恢复到初始状态,则可以重新调用_initialize_weights()方法
300 0
|
PyTorch 算法框架/工具
pytorch中,如何将一个网络参数传给另一个相同网络的参数?
要将一个网络的参数传递给另一个相同网络的参数,可以使用state_dict()方法和load_state_dict()方法。 假设有两个相同的网络net1和net2,它们具有相同的网络结构,但是它们的权重和偏差不同。
909 0
|
Linux
LINUX脚本传递多个带空格参数的解决办法
LINUX脚本传递多个带空格参数的解决办法
345 0
compose 页面间参数正向反向传递方法
compose 页面间参数正向反向传递方法
460 0
|
PHP
如何计算PHP函数中传递的参数数量
在开始本文之前不知道大家对PHP函数有多少了解,那如果你还是刚入门的新人我就推荐大家先看看PHP自学手册中的《PHP函数》章节,毕竟有句话说的好PHP的真正威力源自于它的函数~ 那么本文将给大家介绍关于函数的基础知识:计算PHP函数中传递的参数数量。 首先给大家简单介绍怎么创建函数:
185 0