2010-03-08 17 views
17

W jednym C# można zdefiniować stałą członek typ tak:Jak zdefiniować stałą składową typu w F #?

class Foo { public const int Bar = 600; } 

IL wygląda następująco.

.field public static literal int32 Bar = int32(600) 

Jak mogę zrobić to samo w ciągu wizualne F #/FSharp?

Próbowałem to bezskutecznie:

[<Sealed>] 
type Foo() = 

    [<Literal>] 
    let Bar = 600 
+0

Zadałem to pytanie - http://stackoverflow.com/questions/1834923/f-public-literal - a Chris Smith wskazał, że nie jest to możliwe. – Daniel

Odpowiedz

0

nie jestem pewien, że jest to możliwe. Właściwie nie sądzę, że można tworzyć niezmienne pola publiczne, nie wspominając o stałych.

+0

Wierzę, że możesz tworzyć publiczne niezmienne pola używając deklaracji 'val' i jawnej inicjalizacji w konstruktorze napisanym przy użyciu' new() ', ale to nie działałoby dla stałych, ponieważ pola' val' są inicjowane w konstruktorze. –

+0

@ Tomy - Myślę, że przekonasz się, że twoja sugestia rzeczywiście skutkuje definiowaniem właściwości, a nie polem. Jednak użycie 'valzmable' powoduje zmienne pole. – kvb

+0

Masz rację. public 'val' daje w wyniku własność z prywatnym polem (motywacją jest zabronienie użytkownikom klasy C# modyfikowania pola, które powinno być niezmienne). –

18

Zrobiłem kilka eksperymentów z kompilatorem F # i oto kilka moich obserwacji. Jeśli chcesz utworzyć literał IL, musisz umieścić w nim wartość oznaczoną jako Literal. Na przykład tak:

module Constants = 
    [<Literal>] 
    let Num = 1 

Jako marginesie, zrobiłem szybkie wyszukiwanie poprzez doprecyzowanie F # i wydaje się, że literały mogą być bardzo przydatne do wyszukiwania wzorca, ponieważ można ich używać jako wzorzec (jak dopóki zaczynają się wielką literą):

open Constants 
match 1 with 
| Num -> "1" 
| _ -> "other" 

teraz pytanie brzmi, dlaczego Literal nie zachowuje się jak można się spodziewać, gdy go umieścić wewnątrz deklaracji typu. Myślę, że powodem jest to, że deklaracja let wewnątrz deklaracji typu F # nie może być publiczna i będzie widoczna tylko wewnątrz klasy/typu. Wierzę, że zarówno wartości literowe C# i F # inline podczas korzystania z nich i odbywa się to również wewnątrz deklaracji typu. Ponieważ jednak literał nie może być publiczny, nie ma powodu do generowania pola IL, ponieważ nikt nie miałby do niego dostępu.

+0

W języku C# literały będą wstawiane w bajtode, ale pole const będzie nadal dostępne dla innych typów, które będą używane. – zproxy

+0

Tak - w F # "pole" zostanie wygenerowane, jeśli literał jest publiczny (np. W module) i może być użyte przez kogoś; jeśli jest widoczny tylko wewnątrz klasy, nie ma punktu generującego kod bajtowy, ponieważ inne typy i tak nie mogą go używać. –

Powiązane problemy