我正在尝试返回接口IDictionary
(带字符串键和列表值),如:
IDictionary<string, ICollection<ValueSet>> method( ...) {
}
从方法内部我创建了Dictionary对象:
var dic = new Dictionary <string, List <ValueSet> >();
一切正常,但我无法在这里返回dic
对象。我无法隐含地转换。
我怎样才能让这件事有效?
public IDictionary < string, ICollection < ValueSet > > GetValueSets(ICollection < string > contentSetGuids)
{
var dic = new Dictionary < string, List < ValueSet > > ();
using (SqlCommand command = new SqlCommand())
{
StringBuilder sb = new StringBuilder(ValueSet.ValueSetQueryText);
sb.Append(" where contentsetguid ");
sb.Append(CreateInClause(contentSetGuids));
command.CommandText = sb.ToString();
dic = GetObjects(command).GroupBy(vs => vs.ContentSetGuid).ToDictionary(grp => grp.Key, grp => grp.ToList());
}
return dic;
}
错误: 错误46无法隐式转换类型'System.Collections.Generic.IDictionary&gt;'到'System.Collections.Generic.IDictionary&gt;'。存在显式转换(您是否错过了演员?)
答案 0 :(得分:2)
您无法将IDictionary<String, List<ValueSet>>
投放到IDictionary<String, ICollection<ValueSet>>
,因为IDictionary<TKey, TValue>
不是covariant。例如,IEnumerable<T>
接口是协变,因此如果您愿意,可以将IEnumerable<List<ValueSet>>
投射到IEnumerable<ICollection<ValueSet>>
。
但是,您可以通过在方法中创建正确类型的字典来解决您的问题。例如:
public IDictionary<string, ICollection<ValueSet>> GetValueSets(
ICollection<ValueSet> contentSetGuids)
{
var dic = new Dictionary<string, ICollection<ValueSet>>(); // <--
using (SqlCommand command = new SqlCommand())
{
// ...
dic = GetObjects(command)
.GroupBy(vs => vs.ContentSetGuid)
.ToDictionary(
grp => grp.Key,
grp => (ICollection<ValueSet>)grp.ToList()); // <--
}
return dic;
}
答案 1 :(得分:0)
我会考虑将界面更改为更灵活:
IEnumerable<KeyValuePair<string, IEnumerable<ValueSet>> GetValueSets(
IEnumerable<ValueSet> contentSetGuids)
{
// ....
return GetObjects(command)
.GroupBy(vs => vs.ContentSetGuid)
.Select(new KeyValuePair<string, IEnumerable<ValueSet>>(grp.Key, grp.ToArray())
}
让调用者创建一个字典,它需要一个字典。
通常我会将字符串(键)作为参数传递,并一次只返回一个元素。但是在该方法中,您可以立即获得整个数据,因此这没有多大意义。