이 오류의 출처는 궁금합니다. 다음은 코드이며 fsahrpx를 사용하는 TP 아래입니다."Unsuported Constant Type : System.double"오류를 제공하는 유형 공급자 #
업데이트 : 캐스트를 외부에서 수행하고 캐스트 당 하나의 getter를 만드는 '솔루션'을 발견했습니다. 왜 이런 일이 발생하는지 또는 더 나은 해결책을 알고 있다면 기꺼이 알게 될 것입니다. 합니다 (ProvidedTypes-0.2.fs 제한된 인용 패턴?)
편집 : 내 필사적는 시도가 너무 재미없는 실패했습니다. 두 가지 흥미로운 것은 Test93 또는 Test92입니다. 왜 그들은 실패 할까? 갱신
가장 논쟁을 좋아하는 경우 90,91,92,93
module Module =
open System.Reflection
open Samples.FSharp.ProvidedTypes
open FSharpx.TypeProviders.DSL
open Microsoft.FSharp.Core.CompilerServices
type ReflectiveBuilder = static member Cast<'a> (args:obj) = args :?> 'a
static member BuildTypedCast lType (args: obj) =
typeof<ReflectiveBuilder>
.GetMethod("Cast")
.MakeGenericMethod([|lType|])
.Invoke(null, [|args|])
let bbgReference ns =
erasedType<obj> (Assembly.GetExecutingAssembly()) ns "Reference"
|> staticParameter "file"
(fun typeName (parameterValues:string) ->
let otwo = 2.0 :> obj
let dtwo = 2.0
let dotwo = otwo :?> float
let dcast = ReflectiveBuilder.BuildTypedCast typeof<float>
let getter = match otwo with
| :? double as d -> (fun args -> <@@ d @@>)
| :? string as d -> (fun args -> <@@ d @@>)
erasedType<string> (Assembly.GetExecutingAssembly()) ns typeName
|+!> ( provideProperty
"test90" //KO
(typeof<obj>)
(fun args -> <@@ otwo @@>)
)
|+!> ( provideProperty
"test91" //KO
(otwo.GetType())
(fun args -> <@@ otwo @@>)
)
|+!> ( provideProperty
"test92" //KO
(otwo.GetType())
(fun args -> <@@ otwo @@>)
)
|+!> ( provideProperty
"test93" //NO
typeof<float>
(fun args -> <@@ otwo :?> float @@>)
)
|+!> ( provideProperty
"test" //OK
typeof<float>
(fun args -> <@@ dtwo @@>)
)
|+!> ( provideProperty
"test2" //NO
typeof<float>
(fun args -> <@@ dtwo :> obj @@>)
)
|+!> ( provideProperty
"test3" //NO
typeof<float>
(fun args -> <@@ otwo @@>)
)
|+!> ( provideProperty
"test4" //NO
typeof<float>
(fun args -> <@@ otwo :?> float @@>)
)
|+!> ( provideProperty
"test5" //OK
typeof<float>
(fun args -> <@@ dotwo @@>)
)
|+!> ( provideProperty
"test6" //OK
typeof<float>
(fun args -> <@@ dotwo :> obj @@>)
)
|+!> ( provideProperty
"test7" //NO
typeof<float>
(fun args -> <@@ dcast otwo @@>)
)
|+!> ( provideProperty
"test8" //OK
typeof<float>
getter
)
|+!> (provideConstructor
[]
(fun _ -> <@@ "I will be the internal representation" @@>)))
[<TypeProvider>]
type public CustomTypeProvider(cfg:TypeProviderConfig) as this =
inherit TypeProviderForNamespaces()
do this.AddNamespace("TEST", [bbgReference "TEST"])
[<TypeProviderAssembly>]
do()
테스트
module Program =
open System
type t = TEST.Reference<"">
let price = t().Test90
let price = t().Test91
let price = t().Test92
let price = t().Test93
let price = t().Test //OK
let price = t().Test2 //OK
let price = t().Test3 //NO OK
let price = t().Test4 //NO OK
let price = t().Test5 //OK
let price = t().Test6 //OK
let price = t().Test7 //NO OK
let price = t().Test8 //OK
모르는 경우 Tomas Petricek은 F #을 만든 팀원 중 한 명입니다.Brian McNamara 나 Don Syme이 질문에 무게를 두지 않으면 훨씬 더 권위있는 대답을 얻지 못할 것입니다. –
안녕하세요 @OnorioCatenacci, Tomas 입력에 대한 가치가 매우 높습니다. 새로운 타이핑 기계에 대한 기술을 잘 알고 있습니다.) 여기에서는 Type Provider API의 (실제로) 낮은 레벨을 아는 것이 더 문제라고 생각합니다. 가장자리. (cf 내 사용자 질문에 대한 내 다른 질문을 참조하십시오 .... http : //stackoverflow.com/questions/10357273/type-provider-calling-another-dll-in-f) – nicolas
@OnorioCatenacci 나는 F #을 만든 개발자 중 한 명입니다. 저는 인턴으로 근무했으며 F # 팀과 몇 가지 긴밀한 관계를 맺었습니다.하지만 더 많은 시간을 보내고 유형 공급 업체를 연구하고 구현 한 사람들이 상당수 있습니다. –