2013-12-15 3 views
0

Я хочу создать метод, который в качестве необязательных параметров будет содержать семейство шрифтов и font-weight.Как передать необязательный параметр для 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. 

ответ

2

Значение по умолчанию необязательного параметра метода должно быть одним из следующих типов выражений:

- постоянное выражение;

- выражение формы new 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

Есть несколько способов, чтобы исправить это. Одним из возможных способов, чтобы иметь два метода с одинаковыми именами, но разное количество аргументов:

private void txtBlockSettings(int _FontSize) 
{ 
    txtBlockSettings(_FontSize, new FontFamily("Consolas"), FontWeights.Normal); 
} 

private void txtBlockSettings(int _FontSize, 
           FontFamily _FontFamily, 
           FontWeight _FontWeight) 
{ 
    //Some stuff here 
} 
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 
} 
+0

Мне это нравится. И (я понимаю, что это старо, но), чтобы сделать еще один шаг, теперь вы можете использовать [нулевой оператор коалесцирования] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operator) для этого: '_FontFamily = _FontFamily ?? новый FontFamily («Консола»); – reasra

2

Вы не можете этого сделать, потому что все параметры ссылочного типа могут быть инициализированы только нулевой константой. И «FontFamily» является ссылочным типом.

1

как указано в компиляторе, значения параметров по умолчанию должны быть постоянными, поэтому вы можете получить его, перегружая функцию. код:

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 
    } 
Смежные вопросы