6

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

我有以下设置:

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

假设:

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
}

我在test和中有结果aB

我不明白的是:

为什么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 它可以工作。

4

3 回答 3

1

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

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

这行得通吗(例如aA不为空)?

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

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

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

编辑:

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

is文档:

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

as/ 转换文件:

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

于 2013-01-31T17:09:01.590 回答
0

MSDN中,“as”相当于:

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 在某些情况下实际上是空的;或者,2)您有一个多线程应用程序并且您的代码不是线程安全的(即,有时“is”行是正确的,但是当到达“as”行时,隐含的“is " 变成了假的。)

于 2013-01-31T18:23:27.783 回答
0

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

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

于 2013-02-01T01:30:53.043 回答