Вариант, но не Объект - PullRequest
0 голосов
/ 23 мая 2018

Если я знаю, что часть данных будет объектом, но я не знаю, какого рода, я могу передать его функции или подпрограмме, например:

Sub mySubExpectingAnObject(myVal As Object)

Что болееявный, чем

Sub mySubExpectingAnObject(myVal As Variant)

И должен быть предпочтительным, даже если оба работают

Если вместо этого я знаю, что бит данных не объект, но может быть чем-то другим (Long, Double, String и т. Д.), Есть ли способ Dim использовать аргумент как не объект.Например,

Sub mySubExpectingNotAnObject(myVal As NotObject)

Так как, если я здесь использую Variant, автоматической проверки объектов не будет.Существует ли такой тип;тот, который может инкапсулировать любой необъектный тип данных исключительно?Есть ли обходной путь, отличный от

If isObject(myVal) Then Err.Raise 5

или аналогичный?

1 Ответ

0 голосов
/ 23 мая 2018

Я не вижу, что не так с использованием Variant и выдачей неверного вызова процедуры или аргумента ошибка времени выполнения 5, что в значительной степени буквально говорит "эта процедура"был вызван с недопустимым аргументом ", учитывая, IsObject(theParameter) возвращает True.

Variant существует определенно , чтобы снять ограничения типа времени компиляции, чтобы VBA мог работать с внешними типамитакие как IUnknown и еще много чего: вы не можете использовать Variant и для принудительной проверки любого вида во время компиляции - по определению a VariantТип разрешается только во время выполнения.

Идиоматический способ решения этой проблемы - использование хороших, значимых имен как для вашей процедуры, так и для их параметров.Довольно сложно рекомендовать что-либо с примерами, которые у вас есть.

Не существует типа «вариант, но не объект», и вы не можете использовать Variant и ожидать какой-либо проверки типа ввремя компиляции.

...