2010-03-08 2 views
17

이런 유형 부재 상수를 정의 할 수는F #에서 형식 멤버 상수를 정의하는 방법? C# 1 하나

class Foo { public const int Bar = 600; } 

일리노이는 다음과 같다.

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

어떻게 Visual F #/FSharp에서 동일한 작업을 수행 할 수 있습니까?

나는 아무 소용이 시도 :

[<Sealed>] 
type Foo() = 

    [<Literal>] 
    let Bar = 600 
+0

저는이 질문을했습니다 - http://stackoverflow.com/questions/1834923/f-public-literal - 크리스 스미스 (Chris Smith)는 불가능하다고 지적했습니다. – Daniel

답변

0

나는 이것이 가능하다는 것을 확실하지 않다. 사실, 저는 여러분이 불변의 public 필드를 만들 수 있다고 생각하지 않습니다. 상수는 말할 것도 없습니다.

+0

'val' 선언과'new()'를 사용하여 작성한 생성자의 명시 적 초기화를 사용하여 public immutable 필드를 만들 수 있다고 믿습니다. 그러나 val 필드는 생성자에서 초기화되기 때문에 상수에서는 작동하지 않습니다. –

+0

@ 토마스 - 나는 당신이 제안한 것이 실제로 필드가 아닌 속성이 정의된다는 것을 알게 될 것이라고 생각한다. 그러나 'val mutable'을 사용하면 변경 가능한 필드가 생성됩니다. – kvb

+0

당신 말이 맞아요. 공개'val'은 private 필드를 가진 속성을 만듭니다 (동기는 클래스의 가능한 C# 사용자가 변경할 수없는 필드를 수정하는 것을 금지하는 것입니다). –

18

나는 F # 컴파일러로 몇 가지 실험을 수행했으며, 여기에 몇 가지 관찰을했다. IL 리터럴을 생성하려면 모듈 내에 Literal으로 표시된 값을 배치해야합니다. 이 같은 예를 들어 사이드 참고로

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

으로 (필자는 F 번호 사양을 통해 빠른 검색을했고, 당신이 패턴으로 사용할 수 있기 때문에 리터럴, 패턴 매칭에 매우 유용 할 수 있다는 것 그들은) 대문자로 시작 오랫동안 같이

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

을 이제 Literal 당신이 유형 선언 안에 배치 할 때 사용자가 예상하는대로 동작하지 않는 이유를 질문이다. 그 이유는 F # 형식 선언 내에서 let 선언은 public이 될 수 없으며 클래스/형식 내에서만 볼 수 있기 때문입니다. 나는 C#과 F # 인라인 리터럴 값을 사용할 때이 선언은 타입 선언 안에서도 수행된다고 생각한다. 그러나 리터럴은 공개 될 수 없기 때문에 아무도 액세스 할 수 없으므로 literal IL 필드를 생성 할 이유가 없습니다.

+0

C#에서 리터럴은 바이트 코드에 인라인 될 것입니다. 그러나 const 필드는 다른 유형이 사용될 수 있도록 여전히 존재합니다. – zproxy

+0

예 - F #에서 리터럴이 공개 (예 : 모듈)되어 있고 누군가가 사용할 수있는 경우 '필드'가 생성됩니다. 클래스 내부에서만 볼 수 있다면 바이트 코드를 생성하는 지점이 없습니다. 왜냐하면 다른 형식에서는 사용할 수 없기 때문입니다. –

관련 문제