Почему компилятор пытается и не может преобразовать 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()
гарантированно будет вызван на это.