【发布时间】:2014-03-10 16:52:50
【问题描述】:
我有两个用 C# 编写的库,我想在 F# 应用程序中使用它们。两个库都使用相同的类型,但是,我无法让 F# 的类型检查器相信这一事实。
这是一个使用 Office 互操作类型的简单示例。 F# 似乎对这些类型问题特别敏感。在 F# 方面进行铸造似乎对这种情况没有帮助。所有三个项目都引用了同一个程序集(“Microsoft.Office.Interop.Excel”版本 14.0.0.0)。
在项目“Project1”(一个 C# 项目)中:
namespace Project1
{
public class Class1
{
public static Microsoft.Office.Interop.Excel.Application GetApp()
{
return new Microsoft.Office.Interop.Excel.Application();
}
}
}
在项目“Project2”(一个 C# 项目)中:
namespace Project2
{
public class Class2
{
Microsoft.Office.Interop.Excel.Application _app;
public Class2(Microsoft.Office.Interop.Excel.Application app)
{
_app = app;
}
}
}
在项目“TestApp”(一个 F# 项目)中:
[<EntryPoint>]
let main argv =
let c2 = Project2.Class2(Project1.Class1.GetApp())
0
有什么提示吗?
编辑:
使用以下动态转换更改对Class2 的构造函数的调用可以解决问题:
let c2 = Project2.Class2(Project1.Class1.GetApp() :?> Microsoft.Office.Interop.Excel.Application)
但是,这并不令人满意,因为它是 1) 动态的,以及 2) 我仍然不明白为什么原始类型检查失败。
【问题讨论】:
-
我怀疑答案与 F# 编译器不理解 no-PIA 类型等效规则有关。
-
+1 F# 和 C# 与 COM 互操作的工作方式略有不同,请参见:apollo13cn.blogspot.se/2012/04/trick-in-f-interop.html
标签: c# f# office-interop