none
Una consulta, veo que el compilador no me exige declarar valores booleanos. RRS feed

  • Pregunta

  • En la cabecera de la clase tengo agregada la línea:

    Option Strict On

    Sin embargo veo que en un método de la clase puedo hacer esta declaración:

    Dim bMayor = 3 > 5

    En lugar de esta otra:

    Dim bMayor as Boolean = 3 > 5

    ¿No se supone que al tener activado Option Strict el compilador debe exigir explícitamente el tipo de datos?

    sábado, 20 de junio de 2020 18:13

Respuestas

  • No, es otra cosa distinta. Estás usando la inferencia automática de tipos. Usar el Dim de esa manera en VB es lo mismo que usar var en C#, que es un lenguaje que forzosamente tiene siempre en On el option strict. En ambos casos, el compilador aplica un tipado estricto, infiriendo el tipo desde la parte derecha de la declaración.

    Cuando haces Dim bMayor = algo, el compilador examina el tipo de algo y asigna ese tipo a la variable. La variable queda fuertemente tipada, es decir, el compilador la fuerza a Boolean en este caso, y si más adelante le intentas asignar algo que no sea booleano da un error.

    En otras palabras, el compilador sí que está exigiendo en este caso el tipo explícito del dato, lo que pasa es que con esa sintaxis el tipo lo defines indirectamente a través del contenido que hay a la derecha del igual. Por ejemplo, dará un error si más abajo haces bMayor=1, mientras que si no tuvieras el option strict on esa asignación sí que funcionaría y le asignaría True a la variable. También dará un error si pones solo "Dim bMayor" y no pones un signo igual que permita inferir el tipo.

    Esto es importante cuando usas tipos anónimos, tales como el resultado de una expresión linq que haga un "select new with", porque al ser anónimo el tipo no sería factible escribir esas expresiones si no tuvieses este tipo de sintaxis para permitirle al compilador inferir el tipo.

    • Marcado como respuesta James2016-2 sábado, 20 de junio de 2020 20:02
    sábado, 20 de junio de 2020 19:19

Todas las respuestas

  • No, es otra cosa distinta. Estás usando la inferencia automática de tipos. Usar el Dim de esa manera en VB es lo mismo que usar var en C#, que es un lenguaje que forzosamente tiene siempre en On el option strict. En ambos casos, el compilador aplica un tipado estricto, infiriendo el tipo desde la parte derecha de la declaración.

    Cuando haces Dim bMayor = algo, el compilador examina el tipo de algo y asigna ese tipo a la variable. La variable queda fuertemente tipada, es decir, el compilador la fuerza a Boolean en este caso, y si más adelante le intentas asignar algo que no sea booleano da un error.

    En otras palabras, el compilador sí que está exigiendo en este caso el tipo explícito del dato, lo que pasa es que con esa sintaxis el tipo lo defines indirectamente a través del contenido que hay a la derecha del igual. Por ejemplo, dará un error si más abajo haces bMayor=1, mientras que si no tuvieras el option strict on esa asignación sí que funcionaría y le asignaría True a la variable. También dará un error si pones solo "Dim bMayor" y no pones un signo igual que permita inferir el tipo.

    Esto es importante cuando usas tipos anónimos, tales como el resultado de una expresión linq que haga un "select new with", porque al ser anónimo el tipo no sería factible escribir esas expresiones si no tuvieses este tipo de sintaxis para permitirle al compilador inferir el tipo.

    • Marcado como respuesta James2016-2 sábado, 20 de junio de 2020 20:02
    sábado, 20 de junio de 2020 19:19
  • No, es otra cosa distinta. Estás usando la inferencia automática de tipos. Usar el Dim de esa manera en VB es lo mismo que usar var en C#, que es un lenguaje que forzosamente tiene siempre en On el option strict. En ambos casos, el compilador aplica un tipado estricto, infiriendo el tipo desde la parte derecha de la declaración.

    Cuando haces Dim bMayor = algo, el compilador examina el tipo de algo y asigna ese tipo a la variable. La variable queda fuertemente tipada, es decir, el compilador la fuerza a Boolean en este caso, y si más adelante le intentas asignar algo que no sea booleano da un error.

    En otras palabras, el compilador sí que está exigiendo en este caso el tipo explícito del dato, lo que pasa es que con esa sintaxis el tipo lo defines indirectamente a través del contenido que hay a la derecha del igual. Por ejemplo, dará un error si más abajo haces bMayor=1, mientras que si no tuvieras el option strict on esa asignación sí que funcionaría y le asignaría True a la variable. También dará un error si pones solo "Dim bMayor" y no pones un signo igual que permita inferir el tipo.

    Esto es importante cuando usas tipos anónimos, tales como el resultado de una expresión linq que haga un "select new with", porque al ser anónimo el tipo no sería factible escribir esas expresiones si no tuvieses este tipo de sintaxis para permitirle al compilador inferir el tipo.

    Ah, ya, no es que no le haya asignado el tipo, al asignarle un valor sin poner un tipo explícito el compilador deduce el tipo a partir de ese valor. Muchas gracias.
    sábado, 20 de junio de 2020 20:02
  • Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.
    lunes, 22 de junio de 2020 15:52
    Moderador