【问题标题】:The type 'T' is not compatible with the type 'T'“T”类型与“T”类型不兼容
【发布时间】: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) 我仍然不明白为什么原始类型检查失败。

【问题讨论】:

标签: c# f# office-interop


【解决方案1】:

COM 互操作。当您引用 COM 程序集时,它实际上会生成一个 COM 互操作程序集以在 .NET 和 COM 之间编组。如果您有两个程序集都引用同一个 COM 程序集,您实际上可能有两个相同生成的互操作程序集。

一个解决方案,坦率地说,总体上更好的设计,是在两个程序集(或共享的第三个程序集)之一中创建接口,这些接口公开您想要公开的功能,而不是使用或消费 COM 类型使用这些接口。

namespace Project1
{
    public interface IApplication
    {
        // application members here...
    }

    public class Class1
    {
        public static IApplication GetApp()
        {
            return new ExcelApplication(new Microsoft.Office.Interop.Excel.Application());
        }

        private class ExcelApplication : IApplication
        {
            public ExcelApplication(Microsoft.Office.Interop.Excel.Application app)
            {
                 this.app = app;
            }

            // implement IApplication here...
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2016-07-31
    • 2016-10-17
    相关资源
    最近更新 更多