gpt4 book ai didi

c# - 类型 'T' 与类型 'T' 不兼容

转载 作者:太空狗 更新时间:2023-10-29 20:36:29 26 4
gpt4 key购买 nike

我有两个用 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) 我仍然不明白为什么原始类型检查失败。

最佳答案

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

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

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...
}
}
}

关于c# - 类型 'T' 与类型 'T' 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22306352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com