将IDictionary<TKey, TValue>在.NET 4/Silverlight 4中不支持的协方差,即我不能做
IDictionary<string, object> myDict = new Dictionary<string, string>();
Run Code Online (Sandbox Code Playgroud)
类似于我IEnumerable<T>现在可以做的事情.
可能归结为KeyValuePair<TKey, TValue>不协变.我觉得至少应该在字典中允许协方差值.
这是一个错误还是一个功能?它会不会来,也许在.NET 37.4中?
更新(2年后):
IReadOnlyDictionary<TKey, TValue>在.NET 4.5中会有一个,但它也不会是协变的:·/,因为它派生自IEnumerable<KeyValuePair<TKey, TValue>>,而KeyValuePair<TKey, TValue>不是一个接口,因此不能协变.
BCL团队将不得不重新设计出来并使用一些ICovariantPair<TKey, TValue>代替.this[TKey key]对于协变接口也不可能使用强类型索引器.类似的结束只能通过在GetValue<>(this IReadOnlyDictionary<TKey, TValue> self, TKey key)某个地方放置一个扩展方法来实现,这种方法在内部必须调用一个实际的实现,这可能看起来像一个非常混乱的方法.
我有一个方法,接受一个Hashtable(是的,我知道,它已经过时了......)作为参数:
public static LuaTable HashtableToLuatable(Hashtable t, int depth = 1)
Run Code Online (Sandbox Code Playgroud)
这工作正常.
现在我也想接受一个ArrayList作为第一个参数,所以你可以让't'拥有Hashtable和ArrayList的值.目前我已经两次复制粘贴方法,如下所示:
public static LuaTable ArraylistToLuatable(ArrayList t, int depth = 1)
Run Code Online (Sandbox Code Playgroud)
其余的完全相同.
我认为有一种方法可以合并它.