использование коллекции в универсальной функции

#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. приятно, нравится эта концепция метода расширения