Operador ternario de C# y función IIf en VB.NET. No son iguales.

Una confusión bastante extendida por ahí es pensar que la función IIf de Visual Basic corresponde con el operador ternario de C#. Nada mas lejos de la realidad, a continuación vamos a ver un ejemplo que nos va mostrar la sutil pero importantísima diferencia entre ambos …

El siguiente código en C# funciona a la perfección (o casi), en el ejemplo intentamos asignar a una variable nulable de tipo fecha una entrada de texto utilizando el operador ternario:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime? fecha = null;
 
            Console.WriteLine("Pon la fecha (dd/mm/yyyy):");
            string input = Console.ReadLine(); 

            fecha = (String.IsNullOrEmpty (input)? 
null: (DateTime?) Convert.ToDateTime (input)); Console.WriteLine(fecha.ToString()); Console.WriteLine("Pulse [S] para repertir"); string repetir = Console.ReadLine(); if (repetir == "S") Main(args); } } }

El programa se ejecuta sin problemas (siempre y cuando introduzcamos una expresión de fecha válida!). Sin embargo, si hacemos lo mismo con VB.NET, utilizando la funcion IIf obtendremos un error de en tiempo de ejecución:

    Sub Main()

        Dim fecha As DateTime? = Nothing
        Console.WriteLine("Pon la fecha (dd/mm/yyyy):")
        Dim input As String = Console.ReadLine

        fecha = IIf(String.IsNullOrEmpty(input), Nothing, Convert.ToDateTime(input))

        Console.WriteLine(fecha.ToString)
        Console.ReadLine()
        Console.WriteLine("Pulse S para repertir")
        Dim repetir As String = Console.ReadLine
        If (repetir = "S") Then
            Main()
        End If
    End Sub

La excepcion que obtenemos es la siguiente:

String was not recognized as a valid DateTime.

x10sctmp0

El motivo del error es muy básico y radica en que el operador ternario es un … ¡operador!, y la función IIf es … ¡una funciónSorpresa!!!!.  Es decir, mientras que el operador ternario es un símbolo que interpreta el compilador, la función en invocada en tiempo de ejecución … y al ser invocada evalúa todos sus parámetros, de forma que la conversión a fecha - Convert.ToDateTime(input) - se realiza independientemente del valor de la variable (y en el caso de que este vacía no contiene una expresión válida para su conversión a fecha, por lo que se produce en tiempo de ejecución una FormatException.

En resumen, mucho cuidado con usar la función IIf …

Saludos,

DJK

Pedro  Herrarte  Sánchez
Operador ternario de C# y función IIf en VB.NET. No son iguales.
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:19/05/2011
Última actualizacion:19/05/2011
Visitas totales:11830
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com