Aunque este es un hilo antiguo, estaba preparando una respuesta para Why use a 1-tuple, Tuple<T1> in C#?, que ahora está marcado como un duplicado.
Uno posible uso de un 1-Tuple, es devolver una instancia nula si no hay ningún valor, pero ese nulo del valor del elemento en sí mismo, no significa que no hay ningún resultado.
Por ejemplo (no es un muy buen ejemplo de la vida real, pero es de esperar que transmite el punto)
static List<string> List = new List<string> {"a", "b", null, "c"};
static Tuple<string> GetItemAtIndex(int index)
{
if (index < 0 || index >= List.Count)
return null;
return Tuple.Create(List[index]);
}
El código de llamada sabría que cuando la tupla en sí es nula, no existe en la lista, pero si el Item1 es nulo, en realidad había un elemento nulo en la lista. Por supuesto, en este ejemplo, existen muchas soluciones alternativas mejores, pero también podría aplicarse a un resultado de una base de datos: no se encontró ningún resultado o un resultado nulo.
Ampliando esa misma lógica, se puede usar una Tuple para crear fácilmente métodos genéricos que pueden devolver nulo para cualquier tipo. Por ejemplo
static Tuple<T> GetSomething<T, RecType>(RecType rec, Func<RecType, T> fn)
{
if (rec == null) return null;
//extra example, access would be checked by something like CheckCurrentUserAccess(rec)
bool AccesDenied = true;
if (AccesDenied) return null; //sometimes you don't want to throw an exception ;)
return Tuple.Create(fn(rec));
}
Se podía volver Nullable<T>
, pero que sólo trabajaría para estructuras, donde esto funciona con cualquier tipo, aunque int
, string
, int?
, MyClass
, etc
No creo que en realidad es posible para construir una 1-tupla en F # idiomática, porque el operador de coma es lo que crea una tupla en ese idioma. 'let foo = 3,5' es la definición de una 2-tupla que contiene 3 y 5, pero la única manera de crear una 1-tupla en F #, creo, es de la misma manera que lo harías en C#: 'nuevo System.Tuple (5)' –
O 'Tuple.Create' por supuesto. Aún así, hasta donde yo sé, las 1-tuplas son el único tipo que F # no proporciona ningún azúcar sintáctico. –
@LBushkin hola, ¿alguna vez has visto el código F #/C# real que usa 1-tupla? Tengo curiosidad por los casos de uso del mundo real. – ZhongYu