Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

c# - convert List<List<object>> to IList<IList<object>>

I have written a method which is public List<List<object>> Fetch(string data), inside I create List<List<object>> p = new List<List<object>>();

my boss now wants to return a IList<IList<object>> instead of List<List<object>> ie
public IList<IList<object>> Fetch(string data),

so when I try do return (IList<IList<object>>) p; //throws an exception

How do I convert List<List<object>> to IList<IList<object>> and back to List<List<object>>

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You can't perform that conversion via straight casting - it wouldn't be safe. Instead, you should use:

IList<IList<object>> ret = new List<IList<object>>();

Then for each "sublist" you can use:

// Or whatever
ret.Add(new List<object>());

Finally, just return ret.

You could use LINQ to perform the conversion of your existing List<List<object>> when you return it - but it would be better to just create a more appropriate type to start with, as shown above.


To understand why some of the existing answers are wrong, suppose you could do this:

IList<IList<object>> p = new List<List<object>>();

Then this would be valid:

List<List<object>> listOfLists = new List<List<object>>();
IList<IList<object>> p = listOfLists;
p.Add(new object[]);
List<object> list = p[0];

But p[0] is a reference to an object[], not a List<object>... our supposedly type-safe code doesn't look as safe any more...

Fortunately, IList<T> is invariant to prevent exactly this problem.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

56.9k users

...