我写了几个应用程序,其中我使用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()
被调用。