web-dev-qa-db-fra.com

Déclaration et initialisation d'un tableau de chaînes dans VB.NET

J'essayais de renvoyer un tableau de chaînes à partir d'une fonction et j'ai été surpris par une erreur.

Je me serais attendu à ce que cela fonctionne, mais cela produit une erreur:

Public Function TestError() As String()
    Return {"foo", "bar"}
End Function

Cela marche:

Public Function TestOK() As String()
    Dim ar As String() = {"foo", "bar"}
    Return ar
End Function

De même que:

Public Function TestOK() As String()
    Return New String() {"foo", "bar"}
End Function

Je suppose que je ne suis pas clair sur la signification des {} - existe-t-il un moyen de renvoyer implicitement un tableau de chaînes sans le créer et l'initialiser explicitement?

38
chris

La prise en charge de l'initialiseur de tableau pour l'inférence de type a été modifiée dans Visual Basic 10 par rapport à Visual Basic 9.

Dans la version précédente de VB, il était nécessaire de mettre des parenthèses vides pour signifier un tableau. En outre, il définirait le tableau comme un tableau d'objets, sauf indication contraire:

' Integer array
Dim i as Integer() = {1, 2, 3, 4} 

' Object array
Dim o() = {1, 2, 3} 

Vérifiez plus d'informations:

Visual Basic 2010 Breaking Changes

initialiseurs de collection et de tableau dans Visual Basic 201

36
pirho
Public Function TestError() As String()
     Return {"foo", "bar"}
End Function

Fonctionne bien pour moi et devrait fonctionner pour vous, mais vous devrez peut-être autoriser l'utilisation de déclarations implicites dans votre projet. Je crois que cela désactive les options strictes dans la section Compiler des paramètres du programme.

Puisque vous utilisez VS 2008 (VB.NET 9.0), vous devez déclarer créer la nouvelle instance

New String() {"foo", "Bar"}

14
msarchet

Je crois que vous devez spécifier "Option Infer On" pour que cela fonctionne.

L'option Infer permet au compilateur de deviner ce qui est représenté par votre code, donc il devinera que {"stuff"} est un tableau de chaînes. Avec "Option Infer Off", {"stuff"} n'aura aucun type assigné, ever, et donc il échouera toujours, sans spécificateur de type.

L'option Infer est, I pensez On par défaut dans les nouveaux projets, mais Off par défaut lorsque vous migrez depuis des frameworks antérieurs jusqu'à 3.5.

Avis entrant:

De plus, vous mentionnez que vous avez "Option Explicit Off" . S'il vous plaît ne faites pas cela.

La définition de "Option Explicit Off" signifie que vous n'avez jamais à déclarer de variables. Cela signifie que le code suivant créera silencieusement et de manière invisible la variable "Y":

Dim X as Integer
Y = 3

C'est horrible, fou et faux. Il crée des variables lorsque vous faites des fautes de frappe. J'espère toujours qu'ils le supprimeront de la langue.

6
Frosty840