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.

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ón!¡Sorpresa!!!!. 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