#c# #generics #collections
#c# #универсальные #Коллекции
Вопрос:
Я пытался использовать универсальную функцию для 2 видов коллекций, в которых я вызываю метод Add .
Итак, ниже мой код:
using System;
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void AddElement<T>(ref T container, string key, string value)
{
container.Add(key, value);
}
static void Main(string[] args)
{
SortedList s1 = new SortedList();
Hashtable h1 = new Hashtable();
AddElement<SortedList>(ref s1, "001", "Zara Ali");
AddElement<Hashtable>(ref h1, "001", "Zara Ali");
}
}
}
и ниже ошибка :
ошибка CS1061: ‘T’ не содержит определения для ‘Add’ и нет метода расширения ‘Add’, принимающего первый аргумент типа ‘T’
Так можно ли это выполнить и как это исправить, если это возможно?
Заранее благодарю вас.
Комментарии:
1. На несвязанном примечании использование
ref
не требуется, поскольку вы не переназначаете переменную.2. @pinkfloydx33: извините, я пришел с C , и это моя первая программа, использующая C # 😉 Спасибо
3. Но на самом деле, в чем смысл? Где это может быть полезно (вместо использования уже определенного
Add()
метода)?4. @SeM в моем случае это не обязательно полезно, я просто пытался манипулировать дженериками и коллекциями. определенное добавление работает :).
Ответ №1:
Проблема здесь в том, что T может быть любым (например, int) и не гарантируется наличие метода Add .
Вам нужно ограничить T чем-то, у чего есть метод Add .
static void AddElement<T>(ref T container, string key, string value)
where T : IDictionary
{
container.Add(key, value);
}
Комментарии:
1.
IEnumerable
не содержитAdd
ни того, ни другого. Вместо этого вам нужен не универсальныйIDictionary
.
Ответ №2:
Почему бы не сделать это проще, например, так?
using System;
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void AddElement(IDictionary container, string key, string value)
{
container.Add(key, value);
}
static void Main(string[] args)
{
SortedList s1 = new SortedList();
Hashtable h1 = new Hashtable();
AddElement(s1, "001", "Zara Ali");
AddElement(h1, "001", "Zara Ali");
}
}
}
Комментарии:
1. Да, делайте выводы 🙂 Я пытался манипулировать некоторыми универсальными коллекциями и не знал об Idictional .
Ответ №3:
Или создайте метод расширения:
public static class MyExtensions
{
public static void AddElement(this IDictionary container, string key, string value)
{
container.Add(key, value);
}
}
И использование:
SortedList s1 = new SortedList();
Hashtable h1 = new Hashtable();
s1.AddElement("001", "Zara Ali");
h1.AddElement("001", "Zara Ali");
Комментарии:
1. приятно, нравится эта концепция метода расширения