'로'나는 할 수있다 나는 F 번호에 해당하는 대한 일치 식을해야 할 것 같아요C# 및 F 번호 주조 특히 C#에서 키워드
으로 C#을
match inputValue with
| :? Type1 as type1Value -> type1Value
| _ -> null
이것이 맞습니까?
'로'나는 할 수있다 나는 F 번호에 해당하는 대한 일치 식을해야 할 것 같아요C# 및 F 번호 주조 특히 C#에서 키워드
으로 C#을
match inputValue with
| :? Type1 as type1Value -> type1Value
| _ -> null
이것이 맞습니까?
내가 아는 한, 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)
http://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer-not-an-answer 링크 만 대답, 다른 stackoverflow하지 구체적인 답변 . – Maslow
당신은이 작업을 수행하는 자신의 연산자를 만들 수 있습니다 참조하십시오. 이것은 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
활성 패턴을 사용합니다.
다음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
유형이 정적 경우이 작동 여기 내가 사용하는 것입니다. 유형이 런타임에 정의되는 경우 어떤 생각을해야합니까? 나는 F #에 해당하는 http://stackoverflow.com/a/19068042/23059를 찾고있다. –