Давайте рассмотрим надстройку Excel VSTO и добавим в нее такой класс:
public class SomeClass
{
public Range GetCell(Worksheet worksheet)
{
return worksheet.Cells[1, 1];
}
}
Давайте скомпилируем его; он работает, даже если ничего не делает. Теперь добавьте в проект UserControl (WPF), не ссылаясь на него и не используя его: просто добавьте элемент. Если вы перекомпилируете ie, вы получите сообщение об ошибке:
CS0266 Cannot implicitly convert type 'object' to 'Microsoft.Office.Interop.Excel.Range'. An explicit conversion exists (are you missing a cast?)
Это относится к возвращаемому типу члена Cells[1,1]
.
Внимание! Иногда ошибка даже не появляется, если вы не укажете "Только сборка" в поле, показанном здесь.
Кажется, что-то в динамике c отключено ... но почему?
Возможное решение
При необходимости по-прежнему возможно преобразование типов, фактически это работает:
return (Range)worksheet.Cells[1, 1];
Проблема в том, что объектная модель офиса уже довольно многословна и сильно зависит от Dynami c. Это означает, что в реальном приложении вам потребуется много таких приведений типов, что в итоге приведет к появлению множества приведений типов на строку.
Не говоря уже о том, что эта проблема может указывать на то, что где-то происходит что-то очень неправильное, поэтому Я бы предпочел решить эту проблему, чем прибегать к приведению типов в качестве обходного пути.
Я тестировал это на VS2017 с надстройкой VSTO 2010 и надстройкой VSTO 2013-16, результат тот же. . NET Framework 4.7.2.