您似乎有 2 个相互冲突的目标,归结为您希望扩展方法返回什么:
从您的示例用法中,在此处引用:
List<int> myInts = new List<int>().AddItem(5);
你让它看起来像你想要返回集合。在任何情况下,如果没有强制转换,该分配仍然无法工作,因为您的扩展方法需要返回类型为 ICollection,如下所示:
public static ICollection<T> AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return collection;
}
这将允许你这样做:
List<int> myList = (List<int>) new List<int>().AddItem(5);
现在,如果您宁愿返回添加的对象,您仍然不应该返回类型为object
. 您应该利用泛型类型参数并返回T
,如下所示:
public static T AddItem<T>(this ICollection<T> collection, T itemToAdd)
{
collection.Add(itemToAdd);
return itemToAdd;
}
但是,如果您要退回添加的项目,您将无法像这样链接:
List<int> myList = (List<int>) new List<int>().AddItem(5);
,因为返回类型AddItem(5)
不是ICollection,而是(T
,int
在这种情况下)。不过,您仍然可以链接,就在附加值之外,如下所示:
List<int> myList = new List<int>();
myList.AddItem(5).DoSomethingWithMyInt(); // Not very useful in this case
似乎第一个场景更有用(返回集合),因为它确实允许您在初始赋值语句之后进行链接。这是一个更大的例子:
List<int> myList = (List<int>) new List<int>().AddItem(1).AddItem(2);
或者,如果您不想投射,您可以调用ToList()
返回的 ICollection:
List<int> myList = new List<int>().AddItem(1).AddItem(2).ToList();