2009-10-13 4 views
2

Я использую дженерики перевести Java код C# и возникли проблемы с контейнерами сорта:с использованием дженериков в C# расширения функций

public static class MyExtensions 
{ 
    public static void add(this List<object> list, object obj) 
    { 
     list.Add(obj); 
    } 
    public static void add(this List<string> list, string s) 
    { 
     list.Add(s); 
    } 
} 

кажется, что дженерики теряются в сравнении аргументов и два метода сталкиваются , Я бы хотел, чтобы какие-либо советы о том, можно ли использовать дженерики таким образом. Можно ли поддерживать все операции с списком одним листом:

public static void add(this List<object> list, object obj) 
    { 
     list.Add(obj); 
    } 

например,?

РЕЗЮМЕ Все ответы имеют такое же решение. Список может быть отнесен к ICollection. В целом, вероятно, это не очень хорошая идея для производственного кода.

+0

Что вы подразумеваете под «двумя методами сталкиваются»? Показанный класс компилируется без ошибок. –

+0

Когда я вызываю методы формы myList.add (foo), он сообщает, что не может найти правильный метод - он имеет неправильные аргументы –

+0

Убедитесь, что пространство имен этого класса включено в файл через «using MyExtensionsNamespace;» –

ответ

10

Как насчет:

public static void add<T>(this IList<T> list, T value) 
{ 
    list.Add(value); 
} 

(на самом деле, это может быть ICollection<T>, так как это (не IList<T>) определяет Add(T))

5

Вы пробовали:

public static void add<T>(this List<T> list, T obj) 
{ 
    list.Add(obj); 
} 

Я не конечно, если вы хотите ограничить его классом или нет, но это должно делать то, что вы описываете.

5

ли вы имеете в виду это:

public static void add<T>(this List<T> list, T obj) 
{ 
    list.Add(obj); 
} 
5

Я думаю Marc Gravell answered this best, но я добавлю:

Не делайте этого вообще. Там нет никаких преимуществ:

myList.add(obj); 

против

myList.Add(obj); 

Единственное «преимущество» в том, что ваш полученный C# будет выглядеть неправильно для большинства разработчиков. Если вы собираетесь переносить с Java на C#, стоит потратить дополнительное время, чтобы ваши методы выглядели и работали как собственные методы .NET.

+0

@Reed Я согласен. Это временное решение, чтобы увидеть, насколько легко порты кода. Это позволит избежать ошибок, вызванных чрезмерным автоматическим редактированием. Когда система скомпилируется, я решит, как мы продвигаемся к лучшему решению. –

0

Самый универсальный способ:

public static void add<T>(this ICollection<T> list, T obj) // use ICollection<T> 
{ 
    list.Add(value); 
} 
0

@Dreamwalker, вы имели в виду? list.Add(obj);

Смежные вопросы