У вас, похоже, две противоречивые цели, и все сводится к тому, что вы хотите, чтобы ваш метод расширения возвращал:
- Экземпляр, который вызвал метод расширения (коллекцию)
- ИЛИ элемент, который был добавлен в коллекцию
Из вашего примера использования, приведенного здесь:
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();