Для начала приведу простой пример кода:
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
);
Каким образом необязательный параметр, идет перед обязательным но, при этом ничего не сообщается, ни ошибок, ни предупреждений.
Выходной код выглядит так:
Как такое вообще возможно?
Магия. В .NET есть два способа задания необязательных параметров:
Указывая значение по умолчанию средствами языка, например в C# void Test(int x, int y, int z=0)
. При этом способе все необязательные параметры должны быть указаны в конце списка аргументов, это проверяется при компиляции метода.
Способ с [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 на этот раз вроде нет.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как при помощи метода FileStreamSeek считать часть массива байт от всего массива?
Всем привет, наверно я уже надоел) задаю и задаю вопросыЯ и не знаю как правильно задать этот вопрос
Можете подсказать как занести данные в SQL цикломНапример: я получаю циклом данные из 1С и эти данные занести в SQL
Есть DataGridView с автоматическим заполнением строкНеобходимо скрывать всех кто не на втором курсе и со стипендией, то есть должны оставаться...