Невозможно выполнить явное приведение
Можете ли вы объяснить мне, почему в этом куске кода:
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();
Эрик объяснил почему