2010-02-11 15 views

Respuesta

68

me encontré con esto en un blog: "What does this C# code look like in F#? (part one: expressions and statements)"

C# tiene un operador llamado " predeterminado " que devuelve el valor de inicialización cero de un tipo determinado:

default(int) 

Tiene una utilidad limitada; lo más comúnmente posible puede utilizar por defecto (T) en un genérico. F # tiene una construcción similar como una función de biblioteca :

Unchecked.defaultof<int> 
31

Técnicamente hablando F # función Unchecked.defaultof<'a> es un equivalente al operador default en C#. Sin embargo, creo que vale la pena señalar que defaultof se considera como inseguro cosa en F # y debe usarse solo cuando es realmente necesario (al igual que con null, que también se desaconseja en F #).

En la mayoría de las situaciones, puede evitar la necesidad de defaultof utilizando el tipo option<'a>. Le permite representar el hecho de que un valor aún no está disponible.

Sin embargo, aquí hay un breve ejemplo para demostrar la idea. El siguiente código C#:

T temp = default(T); 
// Code that may call: temp = foo() 
if (temp == default(T)) temp = bar(arg) 
return temp; 

probablemente sería escrito como este en F # (usando características imperativas):

let temp = ref None 
// Code that may call: temp := Some(foo()) 
match !temp with 
| None -> bar(arg) 
| Some(temp) -> temp 

Por supuesto, esto depende de su situación específica y en algunos casos defaultof es lo único tu puedes hacer. Sin embargo, solo quería señalar que defaultof se usa con menos frecuencia en F #.

+1

En su ejemplo de C#, utiliza un operador de asignación en lugar de un operador de igualdad dentro de la instrucción if. Es eso deliberado? – doppelgreener

+0

Debo decir que no funciona para mí, let t = ref None t: = Some (context.Items.FirstOrDefault (fun ii -> ii.Name = i.Name)) coincide con t | Algo que -> - terminado aquí incluso es nulo | Ninguno -> ignorar –

Cuestiones relacionadas