Почему атрибутам Info С# Caller Info требуется значение по умолчанию?

Я просто наткнулся на атрибуты информации о вызывающем абоненте С# 5 (http://msdn.microsoft.com/en-us/library/hh534540.aspx).

Это похоже на очень полезную функцию, и я прочитал некоторую документацию (http://www.codeproject.com/Tips/606379/Caller-Info-Attributes-in-Csharp).

Однако мне просто интересно: почему нужно передавать значения по умолчанию? Как они используются?

В следующем примере кода показано, как использовать атрибуты информации о вызывающем абоненте:

public static void ShowCallerInfo([CallerMemberName] 
  string callerName = null, [CallerFilePath] string 
  callerFilePath = null, [CallerLineNumber] int callerLine=-1)
{
    Console.WriteLine("Caller Name: {0}", callerName);
    Console.WriteLine("Caller FilePath: {0}", callerFilePath);
    Console.WriteLine("Caller Line number: {0}", callerLine);
}

Мой вопрос: каковы значения по умолчанию для null, null и -1? Как отличается код выше:

public static void ShowCallerInfo([CallerMemberName] 
  string callerName = "hello", [CallerFilePath] string 
  callerFilePath = "world", [CallerLineNumber] int callerLine=-42)
{
    Console.WriteLine("Caller Name: {0}", callerName);
    Console.WriteLine("Caller FilePath: {0}", callerFilePath);
    Console.WriteLine("Caller Line number: {0}", callerLine);
}

Как я понимаю, это необязательные параметры, и компилятор поставляет значение по умолчанию, заменяя любое значение по умолчанию, которое мы назначаем. В этом случае, почему мы указываем значения по умолчанию? Есть ли какой-то странный крайний случай, когда компилятор может не заполнить значения и прибегает к значениям по умолчанию, которые мы поставили? Если нет, то почему нас просят ввести эти данные? Кажется довольно неуклюжим просить разработчиков предоставить значения по умолчанию, которые никогда не будут использоваться.

Отказ от ответственности: я пробовал это, но я ничего не смог найти. Я почти боюсь задавать вопросы о SO, потому что большинство таких новичков задают такую ​​враждебность, но в крайнем случае я собираюсь задать вопрос. Модераторы/старшие пользователи, без обид - я действительно пытался найти информацию в другом месте, прежде чем публиковать это.

Ответ 1

Эти параметры нуждаются в значении по умолчанию, поскольку атрибуты Caller Info были реализованы с использованием дополнительных параметров, а дополнительные параметры требуют значения по умолчанию. Таким образом, вызов может быть просто ShowCallerInfo() без необходимости отправлять какие-либо параметры, а компилятор будет добавлять соответствующие.

Почему это было реализовано с использованием необязательных параметров для начала, это более глубокий вопрос. Они могли бы обойтись без него, и компилятор должен был "ввести" эти параметры до начала фактической компиляции, но в отличие от необязательных параметров (что является функцией C# 4.0), не будет обратно совместимой, и это будет разбить другие инструменты анализа компиляторов/кода.

Ответ 2

Им нужны значения по умолчанию, поэтому параметры могут быть помечены как необязательные. Если вы не укажете параметры при вызове метода, компилятор будет вводить правильные значения для вас, но только если вы их не указали. Если вы это сделаете, тогда "волшебство" этих атрибутов не произойдет.

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

Ответ 3

Иными словами, на вызываемом вызове (метод, называемый атрибутом, который применяется к параметру) параметр должен существовать. С другой стороны, вызывающий должен передать эти аргументы, и единственный способ, позволяющий компилятору разрешить неопределенный аргумент, - дать ему значение по умолчанию.

Хотя атрибуты могут влиять на создание кода или выполнение во время выполнения, источник должен быть действительным, если удалять все атрибуты. Поэтому значение значения по умолчанию должно быть определено для вызываемого абонента, а компилятор просто генерирует значение аргумента на основе применяемого атрибута вместо текущего значения по умолчанию, определенного для вызываемого абонента.