Понимание ошибки компиляции 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();
}