“前缀”和“作为”强制转换
本文关键字:转换 前缀 作为 | 更新日期: 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
}
我在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,它可以工作。
您描述的场景至少可以说令人困惑,因此您可以尝试以下方法:
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"已经变成假。