这似乎是关于施法的一个非常愚蠢的问题,但是......
我有以下设置:
主类中有许多类派生。在某个时间点和空间,我得到一个项目,并希望将其作为子类的对象处理。
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
}
我的结果为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就行了。
答案 0 :(得分:1)
您所描述的情景令人困惑,至少可以说,您可以尝试以下方法:
subClassA aA = (someObject as subClassA) ?? (subClassA)someObject;
这是否有效(例如aA
不为空)?
有关as
的一些详细信息,您可能需要参考以下帖子:
Casting vs using the 'as' keyword in the CLR
还在调查一些但我不确定如何重新创建场景...
编辑:
从一些非常聪明的人(Skeet和Lippert)中读取很多,试图找到答案......
请参阅is
文档:
http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.110).aspx
as
/转换文档:
答案 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 语句来保护它。