我想创建一个将font-family和font-weight作为可选参数的方法。
private void txtBlockSettings(int _FontSize,
FontFamily _FontFamily = new FontFamily("Consolas"),
FontWeight _FontWeight = FontWeights.Normal)
{
//Some stuff here
}
但是当我尝试创建上面的方法时,我收到一个错误:
1. Default parameter value for _FontFamily must be a compile time constant.
2. Default parameter value for _FontWeight must be a compile time constant.
答案 0 :(得分:2)
方法的可选参数的默认值必须是以下类型的表达式之一:
- 一个常量表达式;
-an表达式新的ValType(),其中ValType是值类型,例如枚举或结构;
- 表达式默认值(ValType),其中ValType是值类型。
了解更多here
常量声明的类型指定声明引入的成员的类型。常量局部或常量字段的初始值设定项必须是可以隐式转换为目标类型的常量表达式。
常量表达式是一个可以在编译时完全评估的表达式。
因此,reference types
常量的唯一可能值为string
和null
。
了解更多here
但是,您可以通过声明重载来实现此目的:
private void txtBlockSettings(int _FontSize,FontFamily _FontFamily,FontWeight _FontWeight)
{
//Some stuff here
}
private void txtBlockSettings(int FontSize, FontWeight fontWeight )
{
txtBlockSettings(FontSize,new FontFamily("Consolas"), fontWeight);
}
private void txtBlockSettings(int FontSize, FontFamily family)
{
txtBlockSettings(FontSize, family, FontWeights.Normal);
}
private void txtBlockSettings(int FontSize)
{
txtBlockSettings(FontSize, new FontFamily("Consolas"), FontWeights.Normal);
}
答案 1 :(得分:2)
错误消息告诉您,您定义为默认参数的当前参数是在运行时创建的,而不是编译时常量CMIIW。您可以改为使用以下方法:
private void txtBlockSettings(int _FontSize,
FontFamily _FontFamily = null,
FontWeight? _FontWeight = null)
{
if(_FontFamily == null) _FontFamily = new FontFamily("Consolas");
if(_FontWeight == null) _FontWeight = FontWeights.Normal;
//Some stuff here
}
答案 2 :(得分:2)
您不能这样做,因为所有引用类型参数只能使用null常量初始化。 'FontFamily'是参考类型。
答案 3 :(得分:1)
有几种方法可以解决这个问题。一种可能的方法是使两个方法具有相同的名称但参数的数量不同:
private void txtBlockSettings(int _FontSize)
{
txtBlockSettings(_FontSize, new FontFamily("Consolas"), FontWeights.Normal);
}
private void txtBlockSettings(int _FontSize,
FontFamily _FontFamily,
FontWeight _FontWeight)
{
//Some stuff here
}
答案 4 :(得分:1)
正如编译器所说,默认值params必须是常量值,所以你可以通过重载函数来获得它。 代码如下:
private void txtBlockSettings(int _FontSize)
{
//set the default params
FontFamily _FontFamily = new FontFamily("Consolas");
FontWeight _FontWeight = FontWeights.Normal;
//invoke the function using full params
txtBlockSettings(_FontSize, _FontFamily, _FontWeight);
}
private void txtBlockSettings(int _FontSize,
FontFamily _FontFamily,
FontWeight _FontWeight)
{
//Some stuff here
}