泛型类型参数的替换


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"]
]

相关内容

  • 没有找到相关文章

最新更新