为什么编译器试图将Devart.Data.Oracle.OracleCommand转换为System.IDisposab



我写了几个应用程序,其中我使用Devart的DotConnect作为Oracle组件。在我目前的文章中,我看到了 Resharper 提出的几个新问题(如果忽略 Resharper 的输入,应用程序编译并运行良好(。

我有几个特别的(在Resharper的"C#编译器错误"类别中 - 同样,编译器本身并没有真正抱怨这些(是:

"无法将类型'Devart.Data.Oracle.OracleCommand'隐式转换为'System.IDisposable'">

当它没有出现在具有相同类型代码的其他项目中时,为什么现在会成为一个问题,例如:

using (OracleCommand ocmd = new OracleCommand(query, oc)) {

注意:如果我更改代码以使用隐式类型,我也会收到相同的 Resharper 批评/观察,如下所示:

using (var ocmd = new OracleCommand(query, oc)) {

根据文档,它确实实现了IDisposable,正如我所期望的那样。(是的,它必须隐式转换为IDisposable才能在 using 语句中使用。using语句的目的是在资源末尾处置资源,"一次性资源"的表示是IDisposable接口......

请注意,这里真正的 C# 编译器没有问题,否则您将无法运行您的应用程序 - 这表明这是一个 ReSharper 问题。

可能性:

  • R# 可能有自己的 IL 解析,但由于某种原因在 DotConnect 库上失败
  • R# 可能以某种方式"丢失"了程序集(例如,无法加载它(
  • 你可能以某种方式有一个半身像安装

我会从卸载并重新安装 R# 开始,并清除任何 ReSharper 缓存目录,只是为了让事情有一个相当干净的开始。尝试删除然后重新添加对 DotConnect 的引用。

如果失败了,我怀疑你最好与 JetBrains 支持人员交谈,因为它听起来确实是特定于 R#的。我的经验是,他们的技术支持真的很有帮助。

当你说using (someExpresion) { ... }时,那么someExpression一定是IDisposable。这就是说using的重点。

当控制离开块{ ... }时,将检查someExpression是否null,如果没有,则保证Dispose()被调用。

最新更新