“前缀”和“作为”强制转换

本文关键字:转换 前缀 作为 | 更新日期: 2023-09-27 17:56:56

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

我有以下设置:

有许多类派

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

假设:

class subClassA : mainclass 
class subClassB : mainclass 

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

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ;
}
虽然对于大多数子类,返回

正确的对象,但我得到一个子类 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
}

我在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不为空)?

您可能需要参考以下帖子以获取有关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

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

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

在 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) 在某些情况下,某个对象实际上是空的;或者,2)你有一个多线程应用程序,你的代码不是线程安全的(即,有时"is"行为真,但当到达"as"行时,隐式的"is"已经变成假。