Понимание ошибки компиляции C # с троичным оператором

Я скопировал следующий код изWrox Professional ASP.NET 4.0 MVC 4 книга, страница 179 (глава "Понимание векторов безопасности в веб-приложении ") с небольшой модификацией сделать этоprotected и хранение в качестве служебного метода в моем абстрактном приложенииController

protected ActionResult RedirectToLocal(string returnUrl)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Index", "Home");
    }
}

Приведенный выше код направлен на защиту приложения MVC от атак открытого перенаправления, которые не являются предметом вопроса.

Код явно корректен, компилируется, и я верю, что он работает.

Проблема возникает когдабойко» изменив код выше в следующий однострочный

return (Url.IsLocalUrl(returnUrl)) ? Redirect(returnUrl) : RedirectToAction("Index", "Home");

Предполагается, что вышеприведенный однострочный текст делает то же самое, что и расширенный код (нет, ReSharper не сделалне предлагайте мне заменить, это была моя инициатива).

Ошибка компиляции следующая:.there is no implicit conversion between System.Web.Mvc.RedirectResult and System.Web.Mvc.RedirectToRouteResult

Затем на помощь приходит ReSharper и предлагает следующую модификацию

return (Url.IsLocalUrl(returnUrl)) ? (ActionResult) Redirect(returnUrl) : RedirectToAction("Index", "Home");
Вопрос в том "почему я должен привести метод Redirect "?

Поскольку обаRedirect а такжеRedirectToAction вернуть подклассActionResult (проверяется с помощью F12), и этот подкласс является возвращаемым значением функции, он должен быть автоматически совместим. Или, по крайней мере, в моих знаниях C #, либо оба кода компилируются, либо они оба нет.

Чтобы быть более общим, вопрос можно переформулировать следующим образом:

Предположим, у меня есть класс A, B и C

abstract class A {}
class B: A{}
class C: A{}

И предположим, что работает следующая функция

private A Function(){
    if (condition) return new B();
    else return new C();
}

Почему следующий однострочныйт компилировать?

private A Function(){
    return (condition) ? new B(): new C();
}

Ответы на вопрос(2)

Ваш ответ на вопрос