2013-06-03 3 views
2

Почему я не могу указать значение параметра по умолчанию для параметра расширения this?Значение по умолчанию для параметра «this» в C# Методы расширения

public static User CheckLogin(this User user = null) 
{ 
    ... 
} 

Ошибка 108 Не удается задать значение по умолчанию для «этого» параметра

Но, когда я пишу как следующий, компиляция завершается успешно.

public static User CheckLogin([DefaultValue(null)]this User user) 
{ 
    ... 
} 

Может ли кто-нибудь объяснить причину, по которой MS ограничивает первый параметр назначения параметров по умолчанию, позволяя второй?

+9

Я бы сказал метод расширения должен быть связан с экземпляром объекта, и поэтому значение по умолчанию 'this', похоже, не имеет никакого смысла. Зачем вам нужен дефолт 'this'? – Bazzz

+0

@Bazzz Я просто задавался вопросом, почему VS не обнаружил ошибок компиляции. Я знаю, что его нельзя вызвать с нулевым значением. –

+1

@SenJacob На самом деле вы можете вызвать метод расширения, будет иметь нулевой элемент, потому что компилятор изменит его на вызов статического метода. 'Пользователь u = null; u.CheckLogin(); '. Я стараюсь не проверять «this» в моих методах расширения, чтобы избежать использования ключей. –

ответ

7

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

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

Если вы хотите, чтобы это было по желанию, не использовать методы расширения, использовать статические методы вместо:

public static User CheckLogin(User user = null) 
{ 
    // etc 
} 

Затем вызовите «старый» способ:

var user = UserUtils.CheckLogin(/* optional user here */); 
Смежные вопросы