Неясное поведение атрибута OptionalAttribute

209
31 мая 2019, 22:50

Для начала приведу простой пример кода:

int CopyFromBitmap
(
#if UNI
    [In, Optional] Point2U *destPoint,
    [In, MarshalAs(UnmanagedType.IUnknown)] object bitmapObject,
    [In, Optional] RectU *srcRect
#else
    [In, Optional] ref Point2U destPoint,
    [In, MarshalAs(UnmanagedType.IUnknown)] object bitmapObject,
    [In, Optional] ref RectU srcRect
#endif
);

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

Выходной код выглядит так:

Как такое вообще возможно?

Answer 1

Магия. В .NET есть два способа задания необязательных параметров:

  1. Указывая значение по умолчанию средствами языка, например в C# void Test(int x, int y, int z=0). При этом способе все необязательные параметры должны быть указаны в конце списка аргументов, это проверяется при компиляции метода.

  2. Способ с [Optional], который можно применять в любых языках, даже если они не поддерживают синтаксис значения по умолчанию. Значение по умолчанию будет Type.Missing. При данном способе можно указать необязательные аргументы до обязательных. Однако, пропустить эти аргументы можно будет только при использовании именованных аргументов (проверка осуществляется при компиляции вызова метода):

void Test([Optional] int x, int y, [Optional]int z)
{
     Console.WriteLine("{0} {1} {2}", x, y, z);
} 
Test(2);   // => CS7036 Отсутствует аргумент, соответствующий требуемому формальному параметру "y"
Test(y:2); // => 0 2 0

Ничего специфичного для COM Interop на этот раз вроде нет.

READ ALSO
FileStream и метод Seek

FileStream и метод Seek

Как при помощи метода FileStreamSeek считать часть массива байт от всего массива?

147
Переходы между уровней

Переходы между уровней

Всем привет, наверно я уже надоел) задаю и задаю вопросыЯ и не знаю как правильно задать этот вопрос

198
Занести данные в SQL циклом

Занести данные в SQL циклом

Можете подсказать как занести данные в SQL цикломНапример: я получаю циклом данные из 1С и эти данные занести в SQL

135
Логическая операция в DataGridView

Логическая операция в DataGridView

Есть DataGridView с автоматическим заполнением строкНеобходимо скрывать всех кто не на втором курсе и со стипендией, то есть должны оставаться...

174