- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(注意:我声称这不是 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/
编写一个仅用于集中其他接口(interface)的接口(interface)是好的做法还是坏的做法? interface InterfaceA : InterfaceB, InterfaceC { }
有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。 例如,给定: type Mover interface { Mo
我正在尝试制作斐波那契堆。 (在我正在上的算法课中多次提到它们,我想检查一下。)我希望堆使用任何类型的节点,所以我定义了一个 Node 接口(interface): package node type
这是我的代码: type IA interface { FB() IB } type IB interface { Bar() string } type A struct {
示例 A: // pseudo code interface IFoo { void bar(); } class FooPlatformA : IFoo { void bar() {
合并它编译的 leppies 反馈 - 但 IMO 有一些缺点,我希望编译器强制每个子类定义它们自己的 Uri 属性。现在的代码: [] type UriUserControl() = inh
我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索并返回一个 json 格式的标题列表。 我正在使用 serpwow API 来执行谷歌搜索并试图解析响应。 但是我收到的错误是: pa
我只想在其他接口(interface)中实现某些接口(interface),我不希望它们能够被类直接继承。 提前致谢! 最佳答案 您不能在 C# 中执行此操作 - 任何类都可以实现它有权访问的任何接口
我是 Go 的新手,还有一些我还没有掌握的技巧 例如,我有一个可以这样调用的函数: myVar.InitOperation("foo",Operator.EQUAL,"bar") myVar.Init
我有一个通用接口(interface)来描述对输出流的访问,如下所示: interface IOutput { function writeInteger(aValue:Int):Void;
我正在做一个项目,我想通过某种接口(interface)(最好是 USB)将光电探测器电路安装到计算机上。但是,由于我是新手,所以我不知道应该朝哪个方向处理这个问题。假设我有一个带有 USB 连接的光
背景 我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我 域和应用程序服务层可测试。我打算用“穷人的DI”来完成 现
在 Java 中,接口(interface)扩展接口(interface)是完全合法的。 UML 中的这种关系看起来像“扩展”关系(实线、闭合、未填充的箭头)还是“实现”关系(虚线、闭合、未填充的箭头
我想创建一个具有相等和比较函数默认实现的接口(interface)。 如果我从类型 IKeyable 中删除所有内容除了Key成员,只要我不添加默认实现,它就是一个有效的接口(interface)。从
COM 中的双接口(interface)是能够通过 DispInterface 或 VTable 方法访问的接口(interface)。 现在有人可以告诉我这两种方法之间到底有什么区别吗? 我认为 V
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口(in
我想从包装类外部实例化一个内部非静态接口(interface)。 这可能吗? 考虑以下代码: shared class AOuterClass() { Integer val = 3; shared
我为一个类编写了一个接口(interface),如下所示: public interface IGenericMultipleRepository { Lazy> addresses { ge
我是 UML 的初学者,现在我正在创建一个序列图,问题是我想根据用户输入实现 DAO 接口(interface)。如何在时序图中正确绘制以实现接口(interface)。 最佳答案 您不会在 SD 上
要使用 jsr 303 验证创建有条件验证的组,请将接口(interface)类传递给注释,如下所示: @NotEmpty (groups={UpdateValue.class}) 我有很多不同的接口
我是一名优秀的程序员,十分优秀!