Как я могу сопоставить список типа .NET для нуля в типе записи F #? - PullRequest
3 голосов
/ 10 октября 2019

У меня есть класс, определенный в C #:

public class Foo
{
    public string Bar { get; set; }
}

Затем я определяю тип записи в F # с помощью метода, возвращающего новый объект:

type Bar =
    {
        FooList: Foo list
    }
    member this.FromBarList(barList: string list) =
        let fooListNotNull =
            match this.FooList with
            | [] -> []
            | _ -> this.FooList |> List.filter (fun x -> (List.contains x.Bar barList ) )
        {
            FooList = fooListNotNull
        }

Начиная с типа 'Bar'будет использоваться в коде C #, свойство FooList может быть нулевым, и я хотел бы проверить его. Но я получаю сообщение об ошибке:

Тип 'Foo list' не имеет 'null' в качестве правильного значения

Несмотря на то, что я нашел этот тип соответствия вдокументы: https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/values/null-values

Как правильно сопоставить null?

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Можно создать нулевой список F # в F # и, вероятно, также в C #:

let nullList = Unchecked.defaultof<int list>

Вы можете проверить на нулевое значение, но сначала вам нужно заполнить его:

match box nullList with
| null -> []
| _ -> nullList

Вот универсальная функция, чтобы сделать это для любого значения:

let defaultNull defaultValue x =
    match box x with
    | null -> defaultValue
    | _ -> x

Вот как вы бы использовали это в вашем случае:

nullList |> defaultNull []
3 голосов
/ 10 октября 2019

'a list - это тип F #, следовательно, не обнуляется. Я полагаю, что здесь есть неявное преобразование, но фактический тип списка C # - System.Collections.Generic.List<'T>, который можно обнулять. Он удобно именуется как ResizeArray<'T> в F #.

Замените Foo list на ResizeArray<Foo>, тогда предоставленный вами фрагмент должен по крайней мере компилироваться.

...