C# 函数参数默认值问题

代码如下:
private void Print(string message, Color color = Color.White) {}
报错: “color”的默认参数值必须为编译时常量

C# 有2种不同的常量定义方式:编译时常量(compile-time) 和运行时常量(runtime)。所谓编译时常量,是以 const 关键字定义,所谓编译时是常量则以 readonly 关键字定义。

 

C# 规定参数的默认值必须是编译时能确定的常量值。

 

这些参数的类型可以是 C# 认定的基元类型。还可以包括枚举类型,以及能设为 null 的任何引用类型。

 

Color 这个枚举类属于运行时常量。

 

如果硬要写一个带默认值的函数,只能利用重写的方法,例如:

private void Print(string message) 

    Color color = Color.White; 


private void Print(string message, Color color) 

}

 

【附】C# 基元类型:

sbyte / byte / short / ushort /int / uint / long / ulong / char / float / double / bool / decimal /object / string

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-26
Color是什么?一个类?追问

Color是原数据来的,就是.net里面的那个Color。不是我自定义的

追答

哦,没用过,你这个是想要干什么

追问

想要根据color参数指定的颜色输出message,因为大部份是白色所以想在不指定color参数时默认为白色

追答

写个变量,color没有指定颜色的时候变量=“” 让后 去 方法里面直接判断下就可以了, 我没用过这个所有不怎么清楚

C# 函数参数默认值问题
C# 规定参数的默认值必须是编译时能确定的常量值。这些参数的类型可以是 C# 认定的基元类型。还可以包括枚举类型,以及能设为 null 的任何引用类型。Color 这个枚举类属于运行时常量。如果硬要写一个带默认值的函数,只能利用重写的方法,例如:private void Print(string message) { Color color = ...

C# 对于实体对象 参数默认值 怎么设置
楼主你好~首先说明,缺省参数是.Net4.0以后才被C#支持的语法,还是建议使用重载来实现这个功能。对于缺省参数是有两个限制的:1. 缺省参数一定要放在普通参数之后,params参数之前。2. 缺省参数的默认值一定要是一个常量。所以您的Users实体例子违反了第二个限制。请追问~...

C#方法的形参能赋默认值吗?
c++可以给函数参数添加默认值,但是c#不行,你只能用个重载函数或者在开头做判断:private void Send( string smtpAddress , string userName , string password , string to , string title ,string content){ if (null == content || "" == content){ content = "123456789 123456789 123456789 1234...

Missing在C#里是什么意思?我写在C#里面他说上下文不存在 我该怎么办...
多用于Office相关开发,表示参数不存在,由于.NET4以前C#不允许函数参数有默认值,所以没参数时一定要写这个。.NET4后可用method(param1=value,param2=value)来解决。

c# 参数3不可与关键词ref一起传递怎么解决
有点像c语言里面的指针),这样函数里面修改了参数值,外面也就跟着变了。看到这里你应该明白,ref修饰不可能用在引用类型上(如你这里的List),因为引用类型本身就是地址传递,你加个ref,编译器会蒙圈儿,你说对吧?所以你把ref去掉就好了,函数到底对你的List做了什么,在函数执行完以后你自然可以...

如何理解C语言函数参数传递调用的原则一一对应?
3. 参数个数:实参的个数必须与形参的个数一致。如果实参的个数多于形参的个数,将会导致编译错误。如果实参的个数少于形参的个数,将使用默认值(如果有的话)或者未初始化的值(如果没有默认值)来进行对应。下面是一个示例来说明函数参数传递的原则一一对应:```c include <stdio.h> void ...

C#调用DLL中 DllImport 属性详解
这个默认值是有缺点的,因为对于在 Windows 2000、Windows XP 和 Windows NT® 上进行的 interop 调用,它会消极地影响文本参数封送处理的性能。应该显式地选择 CharSet.Ansi 或 CharSet.Unicode 的 CharSet 值而不是使用 CharSet.Auto 的唯一情况是:您显式地指定了一个导出函数,而该函数特定于...

ES6、ES7、ES8、ES9、ES10新特性一览
ES6引入了类(class),使得面向对象编程更易理解和实现,如Java、C#开发者会感到亲切。模块化(Module)在ES6中被标准化,export和import功能使得代码组织更清晰,解决了命名冲突问题。箭头函数(Arrow Functions)简化了this的指向,避免了var self = this或var that = this的常见模式。函数参数默认值和模板...

golang做数据分析(golang做大数据)
默认值为false在方法二中,通过make方式创建的切片对应的数组是由make底层维护,对外不可见,即只能通过slice去访问各个元素。定义一个切片,直接就指定具体数组,使用原理类似于make的方式。Go语言中,切片是长度可变、容量固定的相同的元素序列。Go语言的切片本质是一个数组。容量固定是因为数组的长度是固定...

失败原因:执行SQL失败,失败原因:批处理中出现错误: ORA-00911: invalid...
如果使用C++、Java、C#等编程时,总会习惯在语句最后加分号,而这个符号在SQL中是无效字符。实际语句和列类型不匹配,比如将数值列赋值为字符串。与display函数不同,display_cursor显示的为真实的执行计划。对于format参数,使用与display函数的各个值,同样适用于display_cursor函数。当statistics_level为all或...

相似回答