bug*_*oot 3 string enums f# type-conversion
我在我引用的C#.NET DLL的MyClass
命名空间的公共类中有以下枚举,MyNamespace
并从F#模块打开:
public enum MyEnum {
ValueA,
ValueB,
ValueC}
Run Code Online (Sandbox Code Playgroud)
我想在我的F#模块中将字符串转换s
为MyEnum
等效字符串(如果可能)。试图像...
let myEnumValue = (MyClass.MyEnum) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)
...给我无效使用类型名称和/或对象构造函数的信息。如有必要,请使用“ new”并将构造函数应用于其参数...错误。如果使用typeof<MyClass.MyEnum>
代替,则相同typedefof<MyClass.MyEnum>
。试...
let myEnumValue = (typedefof<MyClass.MyEnum>) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)
...要么...
let myEnumValue = (typeof<MyClass.MyEnum>) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)
...给我值不是函数,无法应用错误。
我MyEnum
在我的F#代码的其他部分使用的都很好,所以我猜我的C#.NET DLL没有问题。
并避免一些可能的问题:-)
MyEnum
使用.ToString()
会将某些值序列化为XML,并且将从XML反序列化的枚举作为参数传递给F#函数。int
等价MyEnum
于XML的读写操作,因为XML应该是人类可读的,而且
值的int
等价物MyClass
比的等价物更可能更改.ToString()
。代码的问题是您尝试将Object(由Parse方法返回)转换为MyClass.MyEnum实例的方式。您尝试使用的语法会导致“类型名称的无效使用”错误。
在F#中,您向下广播如下:
let myEnumValue = Enum.Parse(typedefof<MyClass.MyEnum>, s) :?> MyClass.MyEnum
Run Code Online (Sandbox Code Playgroud)