【问题标题】:Attempt to convert object to generic type results with FS0013 error尝试将对象转换为泛型类型导致 FS0013 错误
【发布时间】:2015-10-08 21:36:22
【问题描述】:

我正在尝试将 obj 转换为 'T 并且在编译时收到 FS0013 错误。
我的代码有什么问题?
也许它坏了,因为我试图从 C# 中“映射”它,而这在 F# 中以完全不同的方式完成?

let myFunc (x : Option<'T>) =
        match x with
            None -> failwith "wtf"
            | Some x -> Convert.ChangeType(x, typedefof<'T>) :> 'T

完整的错误文本:

错误 FS0013:来自类型的静态强制 obj
'T
涉及基于此程序点之前的信息的不确定类型。某些类型不允许使用静态强制。需要更多类型注释。

更新: 这是我正在尝试编写的实际功能。 Option 的值在我没有自己的值时使用。

let ( %? ) (defaultValue : Option<'a>) (parameterName : string) 
                        = match (environVar parameterName) with
                            null -> match defaultValue with
                                    None -> failwith "No value found as well as default value is not set"
                                    | Some defaultVal -> defaultVal
                            | x -> let objectResult = Convert.ChangeType(x, typedefof<'a>)
                                   objectResult :> 'a

【问题讨论】:

    标签: f#


    【解决方案1】:

    你不需要转换!

    只写:

      | Some x -> x
    

    那么你的函数是通用的。 模式匹配已经分解了类型并从选项中解包了值。 不要将obj 与通用'T 混淆。 返回obj 的函数不一定是通用的。

    编辑

    更新后,你可以使用这个:

    objectResult :?> 'a
    

    但是您将没有运行时保证。

    在 F# 中,:&gt; 表示“向上”,:?&gt; 表示“向下”(如果可以的话)。前者有编译时检查,这就是为什么 'cast' 被分成 2 个不同的操作。

    【讨论】:

    • 我试图简化我的问题,但看起来我简化了太多。我将在问题中发布更新的代码。
    • 我更新了问题,如果你能看一下,将不胜感激。
    • 什么是返回类型:environVar parameterName
    • 好的,那么您希望字符串如何转换为任何类型T'
    • 我希望它像 C#: (bool)System.Convert.ChangeType("False", typeof(bool))
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多