Я шукаю еквівалент 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)тоді вираз збігу буде працювати так, як ви очікуєте