"前缀"和"as"演员

Off*_*ler 6 c# casting type-conversion

这似乎是一个关于铸造的非常愚蠢的问题,但......

我有以下设置:

主类中有许多类派生.在某个时间点和空间,我得到一个项目,并希望将其作为子类的对象处理.

Asume:

class subClassA : mainclass 
class subClassB : mainclass 
Run Code Online (Sandbox Code Playgroud)

现在我有一些问题,问它是哪一堂课:

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ;
}
Run Code Online (Sandbox Code Playgroud)

虽然对于大多数子类,返回正确的对象,但我得到一个子类a null-Object.

如果我执行以下操作:

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ; // <- aA = null; someObject is shown in debugger as object of subClassA

    object test = someObject as subClassA; // <- object is not null
    // or 
    subClassA aB = (subClassA)someObject; // <- object is not null, shows the correct object
}
Run Code Online (Sandbox Code Playgroud)

我有结果testaB.

我不明白的是:

为什么as失败并且前缀转换成功?


现在我完全迷失了.

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ; // <- aA = null; someObject is shown in debugger as object of subClassA

    subClassA aB = someObject as subClassA ; // <- aB != null.
}

if(someObject is subClassA)
{
    subClassA aB = someObject as subClassA ; // <- aB != null.
}
Run Code Online (Sandbox Code Playgroud)

名称aA是本地定义的.只有一个线程访问该方法.如果我只是重命名aA它的工作原理.

Kel*_*sey 1

至少可以说,您描述的场景令人困惑,因此您可以尝试以下操作:

subClassA aA = (someObject as subClassA) ?? (subClassA)someObject;
Run Code Online (Sandbox Code Playgroud)

这有效吗(例如aA不为空)?

您可能需要参考以下帖子以了解有关以下内容的一些详细信息as

强制转换与在 CLR 中使用“as”关键字

仍在调查更多内容,但我不确定如何重新创建该场景......

编辑:

阅读了很多非常聪明的人(斯基特利珀特)的文章,试图找到答案......

请参阅is文档:

http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.110).aspx

as/ 转换文档:

http://msdn.microsoft.com/en-us/library/ms173105.aspx