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

前言

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

话题

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

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参数必须出现在所有参数之后

时间: 2024-08-30 08:23:04

你欺骗了我,可选参数必须位于所有参数最后的相关文章

三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

版权声明:本文为sang原创文章,转载请注明出处. 目录(?)[+] 关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个东东.本篇博客我们不讲源码,只看使用.源码的解读会在下一篇博文中带来. inflate方法从大范围来看,分两种,三个参数的构造方法和两个参数的构造方法.在这两类中又有细分,OK,那我们就把各种情况都来演示一遍. 1.三个参数的in

mybatis+mysql返回插入的主键,参数只是提供部分参数

<insert id="insertByChannelIdOpenid" useGeneratedKeys="true" keyProperty="id" parameterType="com.model.StatisticSaler" > insert into statistic_saler(city_id,shop_id,saler_id,type,openid,time) select city_id,sh

python中的可变参数和不可变参数

知识点:Python中,万物皆对象. python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址. 一.可变对象和不可变对象 Python在heap中分配的对象分成两类:可变对象和不可变对象.所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变. 不可变(immutable):int.字符串(string).float.(数值型number).元组(tuple) 可变(mutable):字典型(dictionary).列表型(list) 不可变类型特点: 看下面的

Scala可变参数列表,命名参数和参数缺省

重复参数 Scala在定义函数时允许指定最后一个参数可以重复(变长参数),从而允许函数调用者使用变长参数列表来调用该函数,Scala中使用“*”来指明该参数为重复参数.例如: scala> def echo (args: String *) = | for (arg <- args) println(arg) echo: (args: String*)Unit scala> echo() scala> echo ("One") One scala> ech

内联函数、默认参数和函数占位参数

内联函数 定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质.内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处.编译时,类似宏替换,使用函数体替换调用处的函数名.一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理. C++中的const常量可以替代宏常数定义,如: const int A = 3; ? #define A 3 C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!) C++

nginx全局常用参数(核心功能参数)和其他模块参考

一.全局参数配置参考 常用参数配置示例: user nobody nobody; worker_processes 4; errorlog /var/log/nginx/nginxErrorLog.log; pid    /var/run/nignx.pid; worker_rlimit_nofile 65535; events {     use epoll;     worker_connections 65535; } user指定nginx worker进程运行的用户和用户组,默认是no

python带参数和不带参数装饰器

http://blog.csdn.net/pipisorry/article/details/41902599 对于无参数的装饰器,其装饰器函数的参数是要被装饰的函数对象名: 对于有参数的装饰器在调用时使用的是应用的参数,@timeStumpFunc_args(argv)的argv,已不再是要被装饰的函数对象名,所以必须在内部再定义一个函数getfunc()来接收要被装饰的函数对象. #!/usr/bin/env python # coding=gbk """ __title

mysql中链接参数、文件参数、缓存控制参数

一 连接参数: 二 文件参数相关 三 缓存控制参数

【11g体系结构,6】参数文件和一些参数

一.参数文件的作用: 参数文件记录了数据库的配置.在数据库启动时,Oracle 要根据参数文件中的参数设置, 配置数据库.如要为各个内存池分配多少内存,允许打开的进程数和会话等等.要想让数 据库启动,必需先读取参数文件.参数文件中的参数,我们通常称其为初始化参数,简称就 是参数. 二.参数文件共有两种参数文件 参数文件包含pfile 和spfile.区别如下: 1.PFILE    为文本文件,可以使用vi编辑器进行修改,可以放在客户端和服务端. 文件名为:init<sid>.ora. 从or