c# - 使用 "as"关键字转换对象返回 null

标签 c# casting

这是我的类定义:

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

现在我从委托(delegate)那里得到一个对象,我想转换它,但它并没有像我预期的那样工作。

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

obj类型为 EntityCollectionProxy<AbstractContactEntity> .

但是col一片空白。 如果我尝试常规转换 (var col = (Entity...) obj),我会遇到异常。

我希望它能工作,因为类型是连贯的。 我想念什么?

最佳答案

它们不是同一类型。与 List<string> 相同和 List<int> : 它们也不能相互转换。那AbstractContactEntityAbstractEntity不会改变这个。 从 EntityCollectionProxy<T> 中提取接口(interface)并制作它covariant也不起作用,因为您想实现 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 返回的实例不同。 .

关于c# - 使用 "as"关键字转换对象返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45413326/

相关文章:

c# - 将二进制字符串转换为十六进制

c# - 如何动态转换对象?

java - 使用不受支持的库,导致我进行类型转换

c# - 具有静态成员的枚举与常量/类?

c# - 重新启动 Windows 窗体应用程序

c# - 为什么 ScrollViewer 属性不影响标签?

python - 可以将 numpy 数组添加到 python 集中吗?

c# - 无法从 appsettings.json 的 IConfiguration 提供程序映射实例

c - 为什么有人会在 C 中使用这种类型的转换? float 的引用被强制转换为 int 指针,然后取消引用

java - 将具体集合类型转换到其接口(interface)的性能成本