2012-05-06 35 views
3

我有這樣一組F#記錄類型:反思錯誤在Windows Phone上使用F#sprintf的 「%A」 的時候

type Course = 
    { Id : int 
     Title : string 
     Instructor : string 
     Duration : string 
     StartDate : string 
     IconUrl : string 
     Url : string 
     LectureSections : LectureSection list } 

and LectureSection = 
    { Title : string 
     Completed : bool 
     Lectures : Lecture list } 

and Lecture = 
    { Title : string 
     VideoUrl : string } 

,並在某些時候我打電話

sprintf "%A" course 

這裏當然是課程記錄的一個實例

在一個普通的.NET項目上,這工作正常,但在Windows Phone 7.1/Silverlight 4 F#項目中(我使用Daniel Mohl的模板),出現此錯誤:

Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true. 

問題似乎是列表。有誰知道解決這個問題的方法嗎?

+1

一個明顯的解決方法是重寫'ToString()'成員並使用'sprintf「%O」':) – pad

回答

1

模板應該帶有一個自定義的內置FSharp.Core.dll,用於禁用Windows Phone上不可用的功能。你確定你正在編譯這個DLL,而不是Windows PC嗎?

我有類似的問題與Xbox360和XNA。 F#團隊向我發送了適合用於Xbox360的dll,以及關於用於構建dll的設置的一些簡要說明。

Here is the propertygroup we've used to compile FSharp.Core:

<PropertyGroup Condition="'$(TargetFramework)'=='Xbox360\CompactFramework\3.7'"> 
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> 
    <TargetFrameworkProfile>Client</TargetFrameworkProfile> 
    <XnaFrameworkVersion>v4.0</XnaFrameworkVersion> 
    <XnaPlatform>Xbox 360</XnaPlatform> 
    <XnaProfile>HiDef</XnaProfile> 
    <XnaCrossPlatformGroupID>a8d70e6b-9a75-4aec-80f8-62cf373f7368</XnaCrossPlatformGroupID> 
    <XnaOutputType>Game</XnaOutputType> 
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> 
    <DefineConstants>$(DefineConstants);FX_NO_ARRAY_LONG_LENGTH;FX_NO_DEBUG_PROXIES;FX_NO_EXIT;FX_FSLIB_IOBSERVABLE;FX_NO_WEB_CLIENT;FX_NO_WEB_REQUESTS;FX_NO_CHAR_PARSE;FX_NO_DEFAULT_DEPENDENCY_TYPE;FX_SIMPLE_SECURITY_PERMISSIONS;FX_NO_TRUNCATE;FX_NO_CULTURE_INFO_ARGS;FX_NO_REFLECTION_MODULE_HANDLES;FX_NO_OPERATION_CANCELLED;FX_NO_TO_LOWER_INVARIANT;FX_NO_EXIT_CONTEXT_FLAGS;FX_NO_BASED_ARRAYS;FX_NO_DOUBLE_BIT_CONVERTER;FX_NO_BINARY_SERIALIZATION;FX_NO_ASCII_ENCODING;FX_NO_DEFAULT_ENCODING;FX_NO_FILE_OPTIONS;FX_NO_NONBLOCK_IO;FX_NO_COMMAND_LINE_ARGS;FX_NO_ENVIRONMENT;FX_NO_PROCESS_START;FX_NO_APP_DOMAINS;FX_NO_PROCESS_DIAGNOSTICS;FX_FSLIB_STRUCTURAL_EQUALITY;FX_FSLIB_LAZY;FX_FSLIB_TUPLE;FX_NO_REFLECTION_EMIT</DefineConstants> 
    <Tailcalls>false</Tailcalls> 
    <!-- It would be better to use MSBuild resolution here, but the TargetFrameworkIdentifier etc. aren't set up quite correctly as yet --> 
    <OtherFlags>$(OtherFlags) --simpleresolution -r:"C:\Program Files\Microsoft XNA\XNA Game Studio\v4.0\References\Xbox360\mscorlib.dll"</OtherFlags> 
</PropertyGroup> 

and the new .targets we use:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\Microsoft.Xna.GameStudio.targets" Condition="'$(TargetFramework)'=='Xbox360\CompactFramework\3.7'"/> 

他們給我工作正常,而且我從來沒有使用這些指令,但他們可能是人誰願意建立一個FSharp.Core有用的DLL。 DLL爲一個新的平臺。特別注意DefineConstants部分。

+0

我正在鏈接到模板中定製的FSharp.Core.dll。我可以嘗試從源代碼重新編譯FSharp.Core,看看它是否解決了這個問題。模板上還有兩個額外的文件--FSharp.Core.optdata和FSharp.Core.sigdata - 我不確定它們是什麼,如果我還需要重新生成它們 –

+0

也許是處理%A中的一個錯誤FSharp.Core?如果您搜索錯誤消息,則顯示http://stackoverflow.com/questions/3843042/invoking-a-method-of-a-generic-class。忘記調用'MakeGenericType'的人會得到這個錯誤。 – Joh

+0

我替換了[F#2011年4月CTP]中提供的模板中的FSharp.Core文件(http://www.microsoft.com/en-us/download/details.aspx?id=11100 )在WindowsPhone7 \ Silverlight \ 4.0 \ bin文件夾中,並解決了[另一個問題](http://stackoverflow.com/questions/10486311/f-quotations-on-windows-phone/10558374),我仍然會在%A上發生此異常 –