2010-03-02 4 views

답변

22

내가 아는 한, F #에는 C# as에 해당하는 내장 연산자가 없으므로 좀 더 복잡한 표현식을 작성해야합니다.

let res = if (inputValue :? Type1) then inputValue :?> Type1 else null 

당신은 물론이 동작을 캡슐화하는 기능을 쓸 수 있습니다 작성하여 (: 운영자 :?는 C#으로 is와 같은 방식으로 사용할 수 있기 때문에 또는 match를 사용하여 코드에, 당신은 또한, if을 사용할 수 있습니다 Object 소요) 지정된 제네릭 형식 매개 변수로 캐스트 간단한 일반적인 기능 :

let castAs<'T when 'T : null> (o:obj) = 
    match o with 
    | :? 'T as res -> res 
    | _ -> null 

이 구현은 null 반환, 그래서 유형 매개 변수가 소품으로 null을 가지고 있어야합니다 (또는, Unchecked.defaultof<'T>을 사용할 수 있습니다. 이는 C#에서 default(T)과 동일합니다). 이제 다음과 같이 쓸 수 있습니다 :

let res = castAs<Type1>(inputValue) 
+0

유형이 정적 경우이 작동 여기 내가 사용하는 것입니다. 유형이 런타임에 정의되는 경우 어떤 생각을해야합니까? 나는 F #에 해당하는 http://stackoverflow.com/a/19068042/23059를 찾고있다. –

6

당신은이 작업을 수행하는 자신의 연산자를 만들 수 있습니다 참조하십시오. 이것은 Tomas의 예와 거의 동일하지만이를 호출하는 방법이 약간 다릅니다. 다음은 그 예입니다.

let (~~) (x:obj) = 
    match x with 
    | :? 't as t -> t //' 
    | _ -> null 

let o1 = "test" 
let o2 = 2 
let s1 = (~~o1 : string) // s1 = "test" 
let s2 = (~~o2 : string) // s2 = null 
10

활성 패턴을 사용합니다.

다음
let (|As|_|) (p:'T) : 'U option = 
    let p = p :> obj 
    if p :? 'U then Some (p :?> 'U) else None 

As의 샘플 사용입니다 :

let handleType x = 
    match x with 
    | As (x:int) -> printfn "is integer: %d" x 
    | As (s:string) -> printfn "is string: %s" s 
    | _ -> printfn "Is neither integer nor string" 

// test 'handleType' 
handleType 1 
handleType "tahir" 
handleType 2. 
let stringAsObj = "tahir" :> obj 
handleType stringAsObj 
+2

이것은 불필요합니다. 원래의 질문 노트처럼, F # 패턴 매칭이 내장되어 있습니다. :? int는 i -> i'입니다. –

+0

은이 기능상으로'| : @DanFitch가 암시 하듯이? – Maslow

+1

은 크게 유용한 차이점을 발견했습니다. when 절없이 Post-cast 하위 일치를 수행 할 수 있습니다. '함수 | As (일부 사실) ->() | _ ->()'예를 들어 – Maslow