Список дженериков с возвращением массива, но как? - PullRequest
1 голос
/ 01 февраля 2009

Эти коды действительно скучные. И Tostring () выдает мне ошибку !!! Можете ли вы переставить эти коды?


  class Program
    {
        static void Main(string[] args)
        {
            string[] arraystr = { "yusuf", "mehmet" };
            Ilist myitems = new Ilist(arraystr);

            SelectedItemsList slist = new SelectedItemsList();
            slist.Items.Add(myitems);
            Console.Write(slist.Items[0].ToString());
            Console.ReadKey();
        }
    }
    public class Ilist
    {
        private string[] Ad;

        public Ilist(string[] ad)
        {
            Ad = ad;
        }
        public override string[] ToString()
        {
            return this.Ad;
        }
    }

    public class SelectedItemsList
    {
        public List<Ilist> Items;

        public SelectedItemsList()
        {
            Items = new List<Ilist>();

        }
    }

ошибка:

Generics_List_with_Class.Ilist.ToString () ': тип возвращаемого значения должен быть' string ', чтобы соответствовать переопределенному члену' object.ToString () '

Ответы [ 4 ]

3 голосов
/ 01 февраля 2009

Переименовать Ilist.ToString() в ToStringArray(). У всех объектов есть метод ToString(), но вы переопределяете его функцией с другим типом возвращаемого значения, что приводит к вашей ошибке.

IList не является хорошим именем для класса, потому что соглашение гласит, что имена, начинающиеся с "I", должны быть интерфейсами. Я рекомендую, чтобы Ilist выглядел так:

public class StringList
{
    private string[] Ad;

    public StringList(string[] ad)
    {
        Ad = ad;
    }

    public string[] ToStringArray()
    {
        return this.Ad;
    }

    public override ToString()
    {
        return string.Join(",", Ad);
    }
}

Честно говоря, я рекомендую вам отказаться от всего этого подхода и использовать вместо него List .

2 голосов
/ 01 февраля 2009

Метод, который вы переопределяете, имеет возвращаемый тип строки. Если вы переопределите метод, его сигнатура метода (тип возвращаемого значения, имя и аргументы) должна остаться прежней (ну, есть случаи, когда он может отличаться, но пока предположим, что они должны быть одинаковыми). Итак, ваш метод ToString () должен выглядеть так:

public override string ToString()
{
    ...
}

Вам решать, какое будет лучшее строковое представление, но если вы хотите использовать ToString (), оно должно вернуть строку.

Как Нил Барнвелл предлагает , если вы на самом деле просто хотите вернуть массив, вы можете переименовать текущий метод в что-то вроде:

public string[] GetItems()
{
    return Ad;
}

или, если вам нужна строка, вы можете сделать метод ToString примерно таким:

public override string ToString()
{
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.Append("{ ");
    stringBuilder.Append(string.Join(", ", Ad));
    stringBuilder.Append(" }");
    return stringBuilder.ToString();
}

В зависимости от того, делаете ли вы это для изучения C # или это настоящий код, я бы посмотрел на:

List<string> list = new List<string>()
{
    "yusef",
    "mehmet",
};

если вы используете C # 3.0 или нет:

List<string> myitems = new List<string>();
myitems.AddRange(arraystr);
0 голосов
/ 01 февраля 2009

Ваша функция ToString возвращает массив строк, тогда как метод, который она переопределяет из объекта, должен возвращать одну строку.

Кроме того, присвоение имени вашему классу IList не соответствует обычным шаблонам проектирования: присваивание имен классам с «правильными» именами (например, StringList) и добавление префиксов к интерфейсам с помощью I.

Также, вероятно, стоит иметь список, а не строковый массив как Ad.

0 голосов
/ 01 февраля 2009

Если вы используете C # 3.0, вы можете использовать методы расширения в пространстве имен System.Linq, чтобы упростить его:

IList<string> list = new List<string>();
list.Add("item1");
list.Add("item2");
string[] array = list.ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...