C #: перегружать конструкторы необязательными параметрами и именованными аргументами? - PullRequest
6 голосов
/ 24 февраля 2012

Это не вопрос правильной практики кодирования, я просто работаю над семантикой.допустим, у меня есть следующие конструкторы ...

public FooClass(string name = "theFoo")
{ fooName = name; }

public FooClass(string name, int num = 7, bool boo = true) : this(name)
{ fooNum = num; fooBool = boo; }

возможно ли использовать именованные аргументы таким образом ...?

FooClass foo1 = new FooClass(num:1);  

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

или вызвать конструктор FooClass (string, int, bool) без аргументов?как в ...

FooClass foo2 = new FooClass();

Ответы [ 2 ]

6 голосов
/ 24 февраля 2012

Использование именованных и необязательных аргументов влияет на разрешение перегрузки следующими способами:

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

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

  • Если два кандидата оценены как одинаково хорошие, предпочтение отдается кандидату, у которого нет дополнительных параметров, аргументы которых были опущены в вызове.Это является следствием общего предпочтения в разрешении перегрузки для кандидатов, которые имеют меньше параметров.

http://msdn.microsoft.com/en-us/library/dd264739.aspx

0 голосов
/ 14 января 2015

Необязательные параметры определяются в конце списка параметров после любых обязательных параметров. Если вызывающая сторона предоставляет аргумент для любого из нескольких необязательных параметров, она должна предоставить аргументы для всех предшествующих необязательных параметров. Разделенные запятыми пробелы в списке аргументов не поддерживаются.

Кроме того,

Именованный аргумент может следовать позиционным аргументам, как показано здесь. Рассчитать BMI (123, высота: 64); Однако позиционный аргумент не может следовать за именованным аргументом. Следующее утверждение вызывает ошибку компилятора. // CalculateBMI (вес: 123, 64);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...