在C#中,您可以将对象类型向上转换为通用"对象" s

时间:2017-12-26 17:41:34

标签: c# types casting type-conversion covariance

我有一个object类型的对象,如果我在其上调用GetType(),则在一种情况下返回HashSet<Availability>类型,但返回不相关类型的HashSet<Contact>在另一种情况下,或任何数量的尚未知的HashSet<...>类型。

object myObject = getMyObject();
myObject.GetType() // = HashSet<Availability>

我想将对象向上转换为某种类型的集合(HashSet或其他),同时将集合的泛型类型转换为对象,以便代码不必知道as-编译时尚未知类型。

object myObject = getMyObject();
myObject.GetType() // = HashSet<Availability>
var myUsefulObject = (HashSet<object>)myObject;

当我尝试这个时,我得到一个&#34;无法施放......&#34;异常。

这可能吗? 如果是这样,怎么样?

我相信我拥有的HashSet类型和我想要的HashSet类型之间的协方差,但因为我的初始类型只是一个对象,我无法做this stack-overflow answer suggests。< / p>

1 个答案:

答案 0 :(得分:0)

根据您的问题显示的长链评论显示 - 您无法将HashSet<Availability>强制转换为HashSet<object>,因为在这两种类型之间没有定义隐式\ explicit \ any任何其他转换。但是,HashSet<T>实现了几个协变接口,例如IReadOnlyCollection<T>IEnumerable<T>,您可以将HashSet<Availability>强制转换为这些接口(object):

object myObject = getMyObject();
var myUsefulObject = (IReadOnlyCollection<object>)myObject;

如果类型T在接口中是协变的 - 此类型不能在该接口中的任何方法中用作参数,并且只能用作返回类型。这意味着在这种情况下,所有可能破坏类型安全的方法(例如Add(T item)Remove(T item)等)都不能出现在这样的界面中,并将Availability作为object返回不是问题。