Как переопределить ToString () и реализовать универсальный? - PullRequest
1 голос
/ 04 ноября 2010

У меня есть код, который я хочу сделать следующие изменения:

  1. Как переопределить ToString ()? Он говорит: статический член ... ToString (System.Collections.Generic.List) 'не может быть помечен как переопределенный, виртуальный или абстрактный.

  2. Как мне сделать его универсальным?

    public static override string ToString(this List<int> list) {
        string output = "";
        list.ForEach(item => output += item.ToString() + "," );
        return output;
    }
    

Спасибо!

Ответы [ 4 ]

5 голосов
/ 04 ноября 2010

Если вы хотите переопределить ToString(), вам нужно наследовать от List<T>, а не пытаться его расширить. Вы уже видели, что вы не можете пометить метод статического расширения как переопределение, и разрешение перегрузки всегда будет идти к методу-члену по сравнению с методом расширения, если он доступен. Ваши варианты

  • Наследовать и переопределять
  • Измените имя вашего метода расширения на другое ToSpecialString()
  • Вызовите метод напрямую, используя имя класса MyExtensions.ToString(myList);
4 голосов
/ 04 ноября 2010

Вы не можете использовать методы расширения для переопределения существующего метода.

Из спецификации http://msdn.microsoft.com/en-us/library/bb383977.aspx

"Вы можете использовать методы расширения для расширения класса или интерфейса, но не для их переопределения. Метод расширения с тем же именем и сигнатурой, что и интерфейс илиметод класса никогда не будет вызываться. Во время компиляции методы расширения всегда имеют более низкий приоритет, чем методы экземпляра, определенные в самом типе. "

3 голосов
/ 04 ноября 2010

Чего ты пытаешься достичь? Часто я хочу вывести содержимое списка, поэтому я создал следующий метод расширения:

public static string Join(this IEnumerable<string> strings, string seperator)
{
    return string.Join(seperator, strings.ToArray());
}

Затем потребляется так

var output = list.Select(a.ToString()).Join(",");

РЕДАКТИРОВАТЬ : чтобы упростить использование для нестроковых списков, вот еще один вариант выше

public static String Join<T>(this IEnumerable<T> enumerable, string seperator)
{
    var nullRepresentation = "";
    var enumerableAsStrings = enumerable.Select(a => a == null ? nullRepresentation : a.ToString()).ToArray();
    return string.Join(seperator, enumerableAsStrings);
}

public static String Join<T>(this IEnumerable<T> enumerable)
{
    return enumerable.Join(",");
}

Теперь вы можете потреблять его вот так

int[] list = {1,2,3,4};
Console.WriteLine(list.Join()); // 1,2,3,4
Console.WriteLine(list.Join(", ")); // 1, 2, 3, 4
Console.WriteLine(list.Select(a=>a+".0").Join()); // 1.0, 2.0, 3.0, 4.0
1 голос
/ 04 ноября 2010

Вы можете переопределить метод, только если вы унаследовали базовый класс.

Я бы назвал ваш метод расширения .ToCsv().

...