Здравствуйте, Аноним, Вы писали:
А>В чем разница между ними?
Заключенный между скобками текст — это вычисляемое выражение для VB, соответственно, он его пытается вычислить вплоть до уже невычисляемого типа. Результат вычисления помещается во временное хранение, получает локальное имя и в дальнейшем ничем не отличается от использования без скобок***.
("xxxx") эквивалентно просто "xxxx", поэтому не вызывает ошибок, но (string_var) уже не равно string_var, потому что передаётся фактически значение, т.е. всегда ByVal и string_var не может быть изменено в функции, даже если параметр передаётся ByRef. Иногда это удобно.
С объектами дело обстоит сложнее, потому что VB пытается — рекурсивно — вызвать у объекта его "метод-по-умолчанию" (тот метод, который имеет ID, равным 0), не передавая туда никаких параметров (т.е. трактует выражение db как db()). Вероятно, OraDatabase имеет "метод-по-умолчанию", но имеет дополнительные параметры, или же из метода возвращает нечто, что не приводится к нужному "as OraDatabase".
***
Скобки выражения нужно отличать от скобок при вызове функции. По синтаксису ExecSQL db эквивалентно Call ExecSQL(db) и, следовательно, ExecSQL( db ) == ExecSQL (db) == Call ExecSQL((db)).
Если бы ExecSQL имело бы больше параметров, то ExecSQL p1, p2, p3 был бы эквивалентен Call ExecSQL(p1, p2, p3), а ExecSQL(p1, p2, p3) вызывало бы ошибку синтаксиса, т.к. это недопустимое выражение. Однако допустимо указывать "лишние" скобки в ExecSQL (p1), p2, (p3) или Call ExecSQL((p1), p2, (p3)) с указанными выше соображениями.