c# - "Prefix"和 "as"转换

标签 c# casting type-conversion

这似乎是一个关于类型转换的非常愚蠢的问题,但是......

我有以下设置:

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

阿苏姆:

class subClassA : mainclass 
class subClassB : mainclass 

现在我有一些如果要问它是哪个类:

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ;
}

虽然对于大多数子类都返回了正确的对象,但我为一个子类得到了一个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
}

我在 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.
}

名称 aA 是本地定义的。只有一个线程访问该方法。如果我只是重命名 aA 就可以了。

最佳答案

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

subClassA aA = (someObject as subClassA) ?? (subClassA)someObject;

这行得通吗(例如 aA not null)?

关于 as 的一些详细信息,您可能需要引用以下帖子:

Casting vs using the 'as' keyword in the CLR

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

编辑:

从一些非常聪明的人(SkeetLippert)那里读了很多书试图找到答案......

参见文档:

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

as/转换文档:

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

关于c# - "Prefix"和 "as"转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14630581/

相关文章:

java - 将空对象转换为字符串

c# - 为什么 Convert.ChangeType() 不将日期字符串(以 dd/MM/yyyy 格式)转换为日期时间类型?

casting - cast(T)x 和 to!T(x) 之间的区别

C# 模式搜索

c# - DateTime.Today 与 DateTime.Now

java - 从接口(interface)转换到实现类的性能开销

java - 如何转换为 PostgreSQL 数字类型?

c# - 任何人都可以向我解释这个浮点怪异吗?

c# - Rebus:为每条消息添加用户上下文的建议

c# - 找出两本词典之间的区别