“前缀”和“as”演员

时间:2013-01-31 16:30:56

标签: c# casting type-conversion

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

我有以下设置:

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

Asume:

class subClassA : mainclass 
class subClassB : mainclass 

现在我有一些问题要问哪个班级:

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

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

如果我执行以下操作:

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就行了。

3 个答案:

答案 0 :(得分:1)

您所描述的情景令人困惑,至少可以说,您可以尝试以下方法:

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

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

有关as的一些详细信息,您可能需要参考以下帖子:

Casting vs using the 'as' keyword in the CLR

还在调查一些但我不确定如何重新创建场景...

编辑:

从一些非常聪明的人(SkeetLippert)中读取很多,试图找到答案......

请参阅is文档:

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

as /转换文档:

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

答案 1 :(得分:0)

来自MSDN,&#34; as&#34;相当于:

expression is type ? (type)expression : (type)null

因此,根据MSDN,在您的代码中:

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

相当于

if(someObject is subClassA)
{
    subClassA aA = someObject is subClassA ? (subClassA)someObject : (subClassA)null ;
}

由于someObject is subClassA出现在两行上,我唯一能想到的就是1)someObject在某些情况下实际上是null;或者,2)你有一个多线程的应用程序,你的代码不是线程安全的(即,&#34;是&#34;行是真的,但是当&#34; as&# 34;到达行,隐含&#34;&#34;变为假。)

答案 2 :(得分:0)

  

虽然在大多数情况下会返回正确的对象,但我有时会得到一个null-Object。

对您的问题只有一个简单的解释。 someObject 引用正被另一个线程修改。您需要使用 lock 语句来保护它。