根据反射器,ExpandoObject确实实现了IDictionary<string, object>
我怎么有这个代码,我不明白为什么接口协方差在这里不起作用
从我读过的内容 - 它确实可以起作用:
答案 0 :(得分:3)
这里有三个错误:
IDictionary<TKey, TValue>
在其类型参数int
此处)你应该忽略dynamic
部分 - 这是一个红色的鲱鱼。尝试制定一些您期望的代码,使其不使用dynamic
。以下是IDictionary<,>
不变的原因示例:
// Suppose it were covariant in value...
Dictionary<string, string> stringToString = new Dictionary<string, string>();
IDictionary<string, object> stringToObject = stringToString;
stringToObject["foo"] = new MemoryStream();
string value = stringToString["foo"]; // Um?
// Suppose it were contravariant in value...
Dictionary<string, object> stringToObject = new Dictionary<string, object>();
IDictionary<string, string> stringToString = stringToString;
stringToObject["foo"] = new MemoryStream();
string value = stringToString["foo"]; // Um?
答案 1 :(得分:1)
IDictionary<TKey,TValue>
不支持任何差异
想象一下如果你可以将IDictionary<string,object>
转换为IDictionary<string,int>
会发生什么:int
。但是既然你可以向它添加任意对象,它实际上无法保证这一点。int
不是引用类型。IDictionary<string,object>
的类转换为IDictionary<string,int>
。无论您使用静态铸造还是动态铸造。它根本没有实现该接口。