2015-05-28 1 views
4

В Майкрософт документации VarType MSDN для VarType функции VBScript в это говорит (с жирным акцентом):Почему VarType() всегда возвращает 8204 для Массивы

«Замечание Функция VarType никогда не возвращает значение массива самых . Он всегда добавляется к некоторому другому значению, чтобы указать массив из определенного типа. Значение для Variant возвращается только тогда, когда оно добавлено к значению для Array, чтобы указать, что аргумент функции VarType является массивом . Например, значение, возвращаемое для массива рассчитывается как 2 + 8192, или 8194. Если объект имеет свойство по умолчанию, VarType (объект) возвращает тип своего имущества по умолчанию .»

НО

код, такой как

Dim A,I1, I2, I3 
I1 = 1 
I2 = 2 
I3 = 3 
A = Array(I1,I2,I3) 

Dim A2 
A2 = Split("Test,Test,Test",",") 

AT = VarType(A) 
AT2 = VarType(A2) 
IT1 = VarType(I1) 
IT2 = VarType(I2) 
IT3 = VarType(I3) 

WScript.Echo IT1 
WScript.Echo IT2 
WScript.Echo IT3 
WScript.Echo AT & " - 8192 = " & AT - 8192 
WScript.Echo AT2 & " - 8192 = " & AT2 - 8192 
WScript.Echo CStr(VarType(A(2))) 

возвращается

2 
2 
2 
8204 - 8192 = 12 
8204 - 8192 = 12 
2 

I1 - I3 ВСЕ возвращают свои proper vbInteger И, ссылаясь индивидуально в свой массив, ТАКЖЕ возвращают vbInteger, но массив настаивает, что это массив из vbVariant.

Если я не полностью отсутствует что-то здесь, кажется, что в НЕСМОТРЯ документации нет никакого способа, чтобы создать массив, где элементы являются ВСЕ ЖЕ типа и иметь VarType распознает его как угодно, но только массив vbVariant ,

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

ответ

5

От documentation

В VBScript, переменные всегда одного основного типа данных, Variant.

Данные, содержащиеся в переменной, могут быть любого типа, но сами переменные всегда имеют тип Variant. При проверке с VarType содержимое позиции массива вернет тип содержащихся данных. Но сам массив представляет собой соединение «клетки» из Variant типа

Таким образом, в вашем случае VarType вернется vbArray (8192) + vbVariant (12) = 8204

+1

В документации должно быть указано: «_Arrays_ всегда имеют тип« vbVariant + vbArray' ». Непараметрические переменные и элементы массива могут быть любым подтипом Variant. – Bond

+1

@Bond, нет, документация правильная. 'VarType' возвращает тип для массива. Вы не можете создать целочисленный массив в самом VBScript, но запрос на свойство или вызов метода COM-компоненту может вернуть его, и 'VarType' будет правильно идентифицировать тип данных. –

+0

Справа.Думаю, мы на одной странице. _VBScript сам_ может создавать только массивы 'vbArray + vbVariant' (Array(), Dim, массивы, возвращаемые из функций VBScript и т. Д.), Независимо от того, являются ли элементы однородными. Я не говорю, что вы не можете получить массив non-vbVariant из других средств. Объект «ADO Stream», например, может возвращать массивы 'vbArray + vbByte (UI1)'. – Bond

1

Это просто ошибка в документации:

==>type D:\VB_scripts\SO\30511987.vbs 
option explicit 
Dim ii, aA(3) 
aA(1)=5 
aA(2)="string" 
aA(3)=Now 

Wscript.Echo "array", VarType(aA), TypeName(aA) 

For ii=0 To UBound(aA) 
    Wscript.Echo "aA(" & CStr(ii) & ")", VarType(aA(ii)), TypeName(aA(ii)) 
Next 

==>cscript D:\VB_scripts\SO\30511987.vbs 
array 8204 Variant() 
aA(0) 0 Empty 
aA(1) 2 Integer 
aA(2) 8 String 
aA(3) 7 Date 

==> 
+0

Достаточно честный, «очевидный» ответ мне даже и не приходил. – TofuBug

+1

Нет, в документации нет ошибок. Предположим, что у вас есть свойство в COM-компоненте с определением типа Public Property Get Items() как Integer() '. Возвращенный массив будет иметь тип integer, а 'VarType' будет сообщать об этом как' 8194'. Но массивы, созданные из VBScript, всегда будут Variant –

+0

@MCND есть ошибка (или скорее _mistake_), см. Пример '2 + 8192' в предоставленной вами ссылке ... Однако до вашего ответа я никогда не понимал _ Описание константы vbVariant: '12 Variant (используется только с массивами вариантов)'. Я знал это, но я понимаю ** сейчас! Спасибо .. – JosefZ

Смежные вопросы