Давайте посмотрим на код, сгенерированный F # для простой функции:
let map_add valueToAdd xs =
xs |> Seq.map (fun x -> x + valueToAdd)
Сгенерированный код для лямбда-выражения (экземпляр функционального значения F #) будет выглядеть так:
[Serializable]
internal class map_add@3 : FSharpFunc<int, int> {
public int valueToAdd;
internal map_add@3(int valueToAdd) { this.valueToAdd = valueToAdd; }
public override int Invoke(int x) { return (x + this.valueToAdd); }
}
И посмотрите почти на тот же код C #:
using System.Collections.Generic;
using System.Linq;
static class Program {
static IEnumerable<int> SelectAdd(IEnumerable<int> source, int valueToAdd) {
return source.Select(x => x + valueToAdd);
}
}
И сгенерированный код для лямбда-выражения C #:
[CompilerGenerated]
private sealed class <>c__DisplayClass1 {
public int valueToAdd;
public int <SelectAdd>b__0(int x) { return (x + this.valueToAdd); }
}
Итак, у меня есть несколько вопросов:
- Почему класс, генерируемый F #, не помечен как
sealed
?
- Почему класс, генерируемый F #, содержит публичные поля, поскольку F # не допускает изменяемых замыканий?
- Почему созданный класс F # имеет конструктор? Может быть отлично инициализирован с открытыми полями ...
- Почему класс, сгенерированный в C #, не помечен как
[Serializable]
? Также классы, сгенерированные для выражений последовательности F #, также стали [Serializable]
, а классы для итераторов C # - нет.