2011-03-10 26 views
31

Estaba intentando devolver una matriz de cadenas de una función y me sorprendió un error.Declarar e inicializar una matriz de cadenas en VB.NET

lo que habría esperado que esto funcione, pero produce un error:

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

Esto funciona:

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

como lo hace:

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

Creo que soy no está claro el significado de {} 's - ¿hay alguna manera de devolver implícitamente una matriz de cadenas sin crearla e inicializarla de manera explícita?

Respuesta

30

soporte para matrices inicializador para la inferencia de tipos se han cambiado en Visual Basic Visual Basic 10 vs 9.

En la versión anterior de VB, se requería poner paréntesis vacíos para indicar una matriz. Además, sería definir la matriz como matriz de objetos a menos que de otro modo se dijo:

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

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

Consulte más información:

Visual Basic 2010 Breaking Changes

Collection and Array Initializers in Visual Basic 2010

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

funciona bien para mí y debe trabajar para usted, pero puede que necesite permitir el uso de declaraciones implícitas en su proyecto. Creo que esto está desactivando Opciones estrictas en la sección Compilar de la configuración del programa.

dado que está utilizando VS 2008 (VB.NET 9.0) se tiene que declarar crear la nueva instancia

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

+0

Usando VS2008, el objetivo es .net 3.5, y la opción explícita está desactivada, y sigo recibiendo un error: "Expresión esperada". – chris

6

Creo que es necesario especificar "Option Infer On" para que esto trabajo.

Option Infer le permite al compilador adivinar lo que representa su código, por lo que adivinará que {"cosas"} es una matriz de cadenas. Con "Option Infer Off", {"cosas"} no tendrá ningún tipo asignado, alguna vez, por lo que siempre fallará, sin un especificador de tipo.

Opción Infer es, I think Activada de forma predeterminada en proyectos nuevos, pero desactivada de forma predeterminada cuando se migra desde marcos anteriores hasta 3.5.

Opinión entrante:

Además, se menciona que tienes "Option Explicit Off". Por favor no hagas esto.

Configurando "Opción Explicit Off" significa que no tiene que declarar variables. Esto significa que el siguiente código silenciosa e invisible crear la variable "Y":

Dim X as Integer 
Y = 3 

Esto es horrible, loco, y el mal.Crea variables cuando haces errores tipográficos. Sigo esperando que lo eliminen del idioma.

Cuestiones relacionadas