Почему компилятор пытается и не может преобразовать Devart.Data.Oracle.OracleCommand в System.IDisposable?

Я написал несколько приложений, в которых я использую 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)) {

2 ответа

Решение

Согласно документации, это действительно реализует IDisposable как я и ожидал. (И да, он должен быть неявно конвертируемым в IDisposable для использования в операторе использования. Цель using утверждение заключается в том, что ресурс находится в конце его, а представление "одноразового ресурса" является IDisposable интерфейс...)

Обратите внимание, что настоящий компилятор C# не имеет проблем с этим, иначе вы не сможете запустить свое приложение - что говорит о том, что это проблема ReSharper.

Возможности:

  • R# может иметь собственный синтаксический анализ IL, который по какой-то причине не работает в библиотеке DotConnect
  • R# может как-то "потерять" сборку (или не загрузить ее, например)
  • У вас может быть установка бюста как-то

Я бы начал с удаления и переустановки R#, а также снесения любых каталогов ReSharper для кеша, просто для того, чтобы все началось с чистого листа. Попробуйте удалить, а затем прочитать ссылку на DotConnect.

Если это не удастся, я подозреваю, что вам лучше всего обратиться к поддержке JetBrains, поскольку это звучит специфично для R#. Мой опыт показывает, что их техническая поддержка очень полезна.

Когда ты сказал using (someExpresion) { ... }тогда someExpression должно быть IDisposable, Вот и весь смысл говорить using,

Когда контроль покидает блок { ... }, будет проверено, если someExpression является nullи если нет, Dispose() гарантированно будет вызван на это.

Другие вопросы по тегам