Не думаю, что это носки, связанные с носорогом.
Это ошибка компилятора?
Строка во 2-м блоке кода ниже ОШИБКИ: комментарий дает предупреждение компилятору, и я не понимаю, почему. Еще больше меня удивило то, что блок 3 работает.
Этот работает нормально, поэтому я преобразовал его в Generic ActivatePresenterAction2
private void ActivatePresenterAction1(IListViewHelper<PairDirEntry> lvh)
{
var args = lvh.GetArgumentsForCallsMadeOn(
x => x.ActionOnActivateItem(Arg<Action<PairDirEntry>>.Is.Anything));
Assert.That(args.Count, Is.EqualTo(1));
Assert.That(args[0].Length, Is.EqualTo(1));
var action = (Action<PairDirEntry>)(args[0][0]); // extract the ActivateOnItem action
action(_pairDirEntry); // as if ActionOnActivateItem()
}
Эта работа не компилируется в закомментированной строке
private void ActivatePresenterAction2<T>(IListViewHelper<T> lvh) where T : class
{
var args = lvh.GetArgumentsForCallsMadeOn(
x => x.ActionOnActivateItem(Arg<Action<T>>.Is.Anything));
Assert.That(args.Count, Is.EqualTo(1));
Assert.That(args[0].Length, Is.EqualTo(1));
var action = (Action<T>)(args[0][0]); // extract the ActivateOnItem action
//
// ERROR: is not assignable to parameter type T on hliighted line
// marking the parameter _pairDirEntry
//
action(_pairDirEntry); // as if ActionOnActivateItem()
}
Это изменение в общем случае работает нормально.
ActivatePresenterAction3(_stubSearchResultListViewHelper)(_pairDirEntry);
private Action<T> ActivatePresenterAction3<T>(IListViewHelper<T> lvh) where T : class
{
var args = lvh.GetArgumentsForCallsMadeOn(
x => x.ActionOnActivateItem(Arg<Action<T>>.Is.Anything));
Assert.That(args.Count, Is.EqualTo(1));
Assert.That(args[0].Length, Is.EqualTo(1));
return (Action<T>)(args[0][0]);
}