Здравствуйте Ярослав Говорунов, вы писали:
VD>>В доках есть раздел о дефолтных параметрах в C#, то реально облом!
ЯГ>Кстати, а где, если не секрет?
Я включил фильтрацию по C# и сделал поиск по: "default near param*". См. в конце сообщения.
VD>>По-моему Вы не правы. Уж точно Вы не правы насчет COM-а. В COM-ме есть дефолтные параметры.
ЯГ>Но они подставляются на вызывающей стороне, насколько я помню.
Значения параметров всегда задается вызывающей стороной. Дефолтные параметры — тлько оптимизация (упрощение) для программиста.
VD>>Я и говорю... НЕ в рантайме, а при компиляции.
ЯГ>Во во. Ключевое слово тут "при компиляции". В то время MS считала, что в .NET не должно быть ничего, что можно сделать только при компиляции.
Если в тайп-инфо есть значения, то их можно вынуть и в рантайме. Но зачем?
ЯГ>>>... а значит, пропадает контроль за версиями. Как сообщить клиенту, что новая версия объекта в качестве параметра по умолчанию теперь ожидает не 1, а 2?
ЯГ>Самым лучшим способом проверить — создать на C# метод с параметрами по умолчанию, а потом посмотреть в ildasm. Если будут перегруженные функции, значит дела все еще как и были, если будет запись в Reflection, значит все изменилось...
Для того чтобы проверить сначало надо скомпилировать! А этого и не получаестя.
А я ссылки нащел:
Но повторить пример не получилось :(. Межет в бете-2 или в релизе сделают?! Или в хелпе опечатка (
ms-help://MSDNVS/cpref/html_hh2/frlrfSystemReflectionParameterInfoClassDefaultValueImplTopic.htm
ms-help://MSDNVS/cpguide/html_hh2/cpconaccessingdefaultargumentvalues.htm
Вот цитата из последнего файла:
*Accessing Default Argument Values*
Some languages (such as managed extensions to C++ and Microsoft Visual Basic) support the assignment of default values to some arguments. For example, the following is a legitimate C# declaration that has default values for two of the arguments:
void MyMethod (int a, double b = 1.2, int c = 1)
{
if ( a == c) //…
}
Using a parameter attribute, a parameter value can explicitly be requested to be the default value.
Methods whose arguments have default values can be invoked either by specifying exactly which arguments are defaults or by leaving off the trailing default arguments. For example, all of the following are valid calls for MyMethod:
MyMethod (10, 55.3, 12);
MyMethod (10, 1.3); // c == 1
MyMethod (11) // b == 1.2, c == 1
To retrieve the default value of an argument using reflection, you first get a ParameterInfo object for the parameter, and then retrieve the default value using the ParameterInfo.DefaultValue property. If there is no default value, the property will return Value.DBNull when you try to retrieve it.
The following code prints out the default values for MyMethod to the console:
MethodInfo m = t.GetMethod ("MyMethod");
ParameterInfo[] ps = m.GetParameters();
...