Я шукаю еквівалент default
ключового слова C # , наприклад:
public T GetNext()
{
T temp = default(T);
...
Дякую
Відповіді:
Я знайшов це в блозі: " Як виглядає цей код C # у F #? (Частина перша: вирази та твердження) "
C # має оператор "default", який повертає значення нульової ініціалізації даного типу:
default(int)
Він має обмежену корисність; найчастіше ви можете використовувати за замовчуванням (T) у загальному вигляді. F # має подібну конструкцію як бібліотечна функція:
Unchecked.defaultof<int>
Технічно кажучи, функція F # Unchecked.defaultof<'a>
еквівалентна default
оператору в C #. Однак, я думаю, варто зазначити, що в F # defaultof
розглядається як небезпечна річ, і її слід використовувати лише тоді, коли це дійсно необхідно (так само, як використання null
, що також не рекомендується в F #).
У більшості ситуацій ви можете уникнути потреби defaultof
, використовуючи option<'a>
тип. Це дозволяє представити той факт, що значення ще не доступне.
Однак ось короткий приклад для демонстрації ідеї. Наступний код C #:
T temp = default(T);
// Code that may call: temp = foo()
if (temp == default(T)) temp = bar(arg)
return temp;
Можливо, це буде написано так у F # (з використанням імперативних функцій):
let temp = ref None
// Code that may call: temp := Some(foo())
match !temp with
| None -> bar(arg)
| Some(temp) -> temp
Звичайно, це залежить від вашого конкретного сценарію, і в деяких випадках defaultof
це єдине, що ви можете зробити. Однак я просто хотів зазначити, що defaultof
у F # використовується рідше.
Some(_)
. Він або повертається, Some(value)
або Some(defaultof<>)
обидва відповідатимуть Some _
регістру у вашому виразі відповідності. ви могли б використати context.Items |> Seq.tryFind(fun II -> ii.Name = i.Name)
тоді вираз збігу буде працювати так, як ви очікуєте