为什么"as"关键字在()强制转换时不起作用

Mau*_*imo 7 c# asp.net

//always works, returning a valid object into _page
        _page = _httpContext.Handler as System.Web.UI.Page;

//Fails throwing the exception : Unable to cast object of type 'System.Web.DefaultHttpHandler' to type 'System.Web.UI.Page'
        _page = (System.Web.UI.Page)_httpContext.Handler;
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会这样?

编辑:

                //Fixes the problem
            if(_httpContext.Handler is System.Web.UI.Page)
            _page = (System.Web.UI.Page)_httpContext.Handler;
Run Code Online (Sandbox Code Playgroud)

如果我调试'as'关键字语句,我永远不会得到一个空引用(对象总是正确分配).但是()转换会创建异常,除非它具有if语句.

编辑:在大约15次完成课程后,我得到了一个空.似乎与()转换会捕获异常的速度相比,需要更多运行来查找null.

OLD:当每次类运行时,在'as'语句中有一个调试时,断点命中 - 永远不为null.

当在if中的'()'语句中进行调试时,每次断点击中强制转换时都能正常工作.Werid

kem*_*002 14

//总是有效,将有效对象返回到_page _page = _httpContext.Handler作为System.Web.UI.Page;

这在技术上没有用.如果你会发现_pagenull.它只是没有抛出错误.

as运营商是用来告诉应用程序"我要你去尝试和转换,这也许不是,我也知道这一点,所以不要抛出异常.我会相应地处理它."

()转换是用来告诉应用程序"这个对象将转换为这种类型.如果没有什么是错的,我需要了解它."

两个演员表之间的差异(以及你应该使用它们的时候)是当你"认为"某些东西可以转换为另一种类型时,当你"知道"某些东西可以转换成另一种类型时.

这是Eric Lippert关于这个主题的一篇文章(改为他的博客没有被重新编写):http: //blogs.msdn.com/ericlippert/archive/2009/10/08/what-s-the-difference-between -as-和铸造operators.aspx


dav*_*vek 7

从这里:

使用as运算符与C#中的强制转换器有三个不同的重要方面:

当您尝试转换的变量不是请求的类型或它的继承链时,它返回null,而不是抛出异常.它只能应用于转换为引用类型的引用类型变量.使用as不会执行用户定义的转换,例如隐式或显式转换运算符,这些转换运算符将执行转换.实际上在IL中定义了两个完全不同的操作来处理这两个关键字(castclass和isinst指令) - 它不仅仅是由C#编写的"语法糖"来获得这种不同的行为.与投射相比,微软CLR的v1.0和v1.1中的as运算符似乎略快一些(即使在没有无效的强制转换的情况下,由于异常会严重降低投射的性能).

  • @Maus它实际上不起作用.第一行实际上将`null`放入_page,这看起来不像你期望的那样 (3认同)