gpt4 book ai didi

c# - 尝试包装 COM 接口(interface)使其 IDisposable 时出现意外的 C# 编译器错误

转载 作者:行者123 更新时间:2023-11-30 16:09:27 24 4
gpt4 key购买 nike

(注意:我声称这不是 Clean up Excel Interop Objects with IDisposable 的副本。这个问题问“我该怎么做?”我的主要问题是“为什么我会收到 C# 编译器错误?”)

此处的主要目标是从 C# 程序中读取(然后写入)Excel 文件。 Google 建议我应该添加对 Microsoft.Office.Interop.Excel 的引用并从那里运行。我看到足够多的代码知道我正在执行 COM 互操作,因此我想在完成 COM 对象后处置它们。添加引用(到 Visual Studio 2012 中的 Microsoft.Office.Interop.Excel 版本 14.0.0.0)后,我开始比赛了。

现在,我不相信自己记得在所有正确的地方调用所有对 Marshal.ReleaseComObject 的调用,所以我想将我的 COM 对象放入 using 声明。 Microsoft.Office.Interop.Excel.Application 不是 IDisposable,据我所知,Microsoft.Office 中的任何其他内容也不是。 Interop.Excel 命名空间。不过没关系。我很聪明。我知道如何解决这个问题:

using Excel = Microsoft.Office.Interop.Excel;
//...
sealed class ExcelWrapper<T> : IDisposable
{
public T Child { get; private set; }
public ExcelWrapper(T child) { Child = child; }
public static implicit operator ExcelWrapper<T>(T child) { return new ExcelWrapper<T>(child); }
public static implicit operator T(ExcelWrapper<T> host) { return host.Child; }

public void Dispose()
{
try { Marshal.ReleaseComObject(Child); }
catch { }
}
}
//...
using (ExcelWrapper<Excel.Application> _xlApp = (ExcelWrapper<Excel.Application>)new Excel.Application()) // CS0030
{
Excel.Application xlApp = _xlApp; // CS0029 and CS0266
}

这会向我显示我不理解的错误消息(上面的注释指出有错误的行):

 error CS0030: Cannot convert type 'Microsoft.Office.Interop.Excel.Application' to 'ExcelWrapper<Microsoft.Office.Interop.Excel.Application>'
error CS0029: Cannot implicitly convert type 'ExcelWrapper<Microsoft.Office.Interop.Excel.Application>' to 'Microsoft.Office.Interop.Excel.Application'

为什么我会收到这些错误消息?我没有键入 public static implicit operator 吗?出于某种原因,我尝试解封 ExcelWrapper。事情发生了变化,但我仍然不明白发生了什么:

error CS0266: Cannot implicitly convert type 'ExcelWrapper<Microsoft.Office.Interop.Excel.Application>' to 'Microsoft.Office.Interop.Excel.Application'. An explicit conversion exists (are you missing a cast?)

我仍然非常确定存在隐式转换。但我可以通过使用显式转换来安抚编译器,只要我可以让 ExcelWrapper 未密封。

那么,我做错了什么?

ExcelWrapper 类被密封时,为什么编译器似乎完全忽略了我的转换运算符?当 ExcelWrapper 类未密封时,为什么编译器似乎忽略了 隐式 指定(而不是运算符的其余部分)?

最佳答案

Section 10.9.3语言规范说明:

A conversion operator converts from a source type, indicated by the parameter type of the conversion operator, to a target type, indicated by the return type of the conversion operator. A class or struct is permitted to declare a conversion from a source type S to a target type T provided all of the following are true:

- S and T are different types.
- Either S or T is the class or struct type in which the operator declaration takes place.
- Neither S nor T is object or an interface-type.
- T is not a base class of S, and S is not a base class of T.

Excel.Application 是一种接口(interface)类型,这就是您无法创建隐式转换的原因。

该规范的在线版本有点过时,您的安装目录中有一个更新版本。转换规则的新部分是 10.10.3。对于 VS 2013,规范位于:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033

在更新的版本中,还有这样的声明:

  • If T is an interface type, user-defined implicit conversions from S to T are ignored.

但尚不完全清楚这是否适用于全局或仅当存在从 S 到 T 的显式转换时才适用。

关于c# - 尝试包装 COM 接口(interface)使其 IDisposable 时出现意外的 C# 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27612428/

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