使用“as”关键字转换对象返回 null

问题描述 投票:0回答:1

这是我的类定义:

public abstract class AbstractEntity : ...
public partial class AbstractContactEntity : AbstractEntity, ...
public sealed class EntityCollectionProxy<T> : IList<T>, System.Collections.IList where T : AbstractEntity

现在我从委托那里得到一个对象,我想转换它,但它没有像我期望的那样工作:

EntityCollectionProxy<AbstractContactEntity> obj = resolver.DynamicInvoke (this.entity);
var col = obj as EntityCollectionProxy<AbstractEntity>;

col
为空。 如果我尝试常规铸造,
var col = (Entity...) obj)
,我会遇到例外。

我预计它会起作用,因为类型是一致的。 我错过了什么?

c# casting
1个回答
8
投票

它们不是同一类型。这与

List<string>
List<int>
相同:它们也不能相互投射。
AbstractContactEntity
AbstractEntity
并不会改变这一点。 从
EntityCollectionProxy<T>
中提取接口并使其成为协变也不起作用,因为您想要实现
IList<T>
,这意味着您拥有
T
类型的输入参数和返回值,这会阻止协变。

唯一可能的解决方案如下:

var tmp = (EntityCollectionProxy<AbstractContactEntity>)obj;
var col = tmp.Select(x => (AbstractEntity)x);

col
的类型为
IEnumerable<AbstractEntity>
。如果你想拥有一个
EntityCollectionProxy<AbstractEntity>
,你需要创建一个新的:

var result = new EntityCollectionProxy<AbstractEntity>(col);

这假设您的

EntityCollectionProxy<T>
类有一个接受
IEnumerable<T>
的构造函数。
但请注意,这将是一个新实例,与
resolver.DynamikInvoke
返回的实例不同。

© www.soinside.com 2019 - 2024. All rights reserved.