interface IFoo
{
public ICollection<ICollection<string>> GetWords();
}
class Foo : IFoo
{
public ICollection<ICollection<string>> GetWords()
{
return new List<List<string>>() { new List<string>() { "word" } };
}
}
不允许("不能隐式转换类型…")
当接口是根据接口(泛型)定义的,并且实现当然是使用类型的实现时,我如何避免自己必须进行类型强制转换?
我觉得实现者应该选择使用哪种ICollection
实现来提供功能,所以这就是为什么我希望接口中的类型保持ICollection
,并且调用者可以知道他们正在使用某些ICollection
,但是接口不应该强制实现者使用特定的ICollection实现,也不应该必须处理(冗余?)显式子类型到超类型的类型转换。
我正在使用泛型类型,在我的情况下,我得到了错误:
不能隐式地将类型'System.Collections.Generic.Dictionary<int,>'转换为'System.Collections.Generic.Dictionary<int,>'
我不相信传说中缺乏对协方差的支持是解释,如果是的话,请向我解释一下如何解释。我不同意评论中的解释:
界面……定义了一个方法返回类型
SomeBase
,并使用返回SomeDerived
的方法重写派生类。当前不支持
因为这个小提琴(没有嵌套的泛型)正好成功地做到了:dotnetfiddle.net/qkpxN8
这个页面:https://learn.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance也说
可以将IEnumerable的实例赋值给IEnumerable类型的变量。
此代码已在visual studio中测试过,运行正常。
public interface IFoo
{
public ICollection<ICollection<string>> GetWords();
}
public class Foo : IFoo
{
public ICollection<ICollection<string>> GetWords()
{
var list= new List< List<string>>() { new List<string> { "one", "two" }};
ICollection<string> strings = new List<string>();
ICollection<ICollection<string>> collection =new List<ICollection<string>>();
for (var i = 0; i < list.Count; i++)
{
for (var j = 0; j < list[i].Count; j++)
{
strings.Add(list[i][j]);
}
collection.Add(strings);
}
return collection;
}
}
在visual studio中进行了测试
static void Main()
{
var foo = new Foo();
var words = foo.GetWords();
var json = System.Text.Json.JsonSerializer.Serialize(words);
}
json
[
["one","two"]
]