Невозможно выполнить явное приведение

Можете ли вы объяснить мне, почему в этом куске кода:

private Dictionary<Type, Type> viewTypeMap = new Dictionary<Type, Type>();

public void ShowView<TView>(ViewModelBase viewModel, bool showDialog = false)
    where TView : IView
{
    var view = Activator.CreateInstance(viewTypeMap[typeof(TView)]);
    (IView)view.ShowDialog();
}

Я получаю ошибку:

"Только операторы присваивания, вызова, приращения, декремента и нового выражения объекта могут использоваться как оператор".

IView определяет метод ShowDialog().

4 ответа

Решение

Оператор приведения имеет более низкий приоритет, чем оператор доступа к элементу.

(A)B.C();

анализируется как

(A)(B.C());

что не является юридическим заявлением. Вы должны написать

((A)B).C();

если вы хотите разыграть B в A а затем позвоните C() по типу A,

Для вашего будущего использования таблица приоритетов находится здесь:

http://msdn.microsoft.com/en-us/library/aa691323(v=VS.71).aspx

Почему бы не попробовать следующее, чтобы ваш объект представления был объявлен как IView вместо объекта?

public void ShowView<TView>(ViewModelBase viewModel, bool showDialog = false) where TView : IView
{
    var view = (IView)Activator.CreateInstance(viewTypeMap[typeof(TView)]);
    view.ShowDialog();
}

Вы можете разыграть его так, как он создается, тогда, если он будет использоваться несколько раз, вам не нужно будет каждый раз переписывать его.

var view = (IView)Activator.CreateInstance(viewTypeMap[typeof(TView)]);
view.ShowDialog();

+ Изменить

(IView)view.ShowDialog();

в

((IView) view).ShowDialog();

Эрик объяснил почему

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