usr*_*ΛΩΝ 3 c# inheritance if-statement ternary-operator
我已经从Wrox Professional ASP.NET 4.0 MVC 4第179页("了解Web应用程序中的安全性向量"一章)中复制了以下代码,并对其进行了一些修改,并将其protected作为实用方法存储在我的抽象应用程序中Controller
protected ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码旨在保护MVC应用程序免受开放重定向攻击,这些攻击不是问题的主题.
代码显然是格式良好,编译,我相信它的工作原理.
当"巧妙地"将上面的代码更改为以下单行时,就会出现问题
return (Url.IsLocalUrl(returnUrl)) ? Redirect(returnUrl) : RedirectToAction("Index", "Home");
Run Code Online (Sandbox Code Playgroud)
上面的单行应该与扩展代码完全相同(不,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");
Run Code Online (Sandbox Code Playgroud)
由于两个Redirect与RedirectToAction返回的一个子类ActionResult(通过F12验证)和子类是函数的返回值,应该是自动兼容.或者至少,根据我对C#的了解,要么两个代码都编译,要么两者都不编译.
更一般地说,问题可以重新拟定如下:
假设我有A,B和C类
abstract class A {}
class B: A{}
class C: A{}
Run Code Online (Sandbox Code Playgroud)
并假设以下功能有效
private A Function(){
if (condition) return new B();
else return new C();
}
Run Code Online (Sandbox Code Playgroud)
为什么下面的单行程不能编译?
private A Function(){
return (condition) ? new B(): new C();
}
Run Code Online (Sandbox Code Playgroud)
它不会编译,因为编译器根据两个返回值之一决定一个内容的返回类型.由于类型B不是派生类型C,反之亦然,这两种类型不是互斥的,并且if(作为一个整体)的返回类型不能以这种方式派生.
如果您希望在单行中执行此操作,则必须将返回值强制转换为要返回的类型,即类型A.
private A Function(){
return (condition) ? ((A)new B()): ((A)new C());
}
Run Code Online (Sandbox Code Playgroud)
更新:我没有看到你已经在你的问题中进行了投射,我的道歉.