Как решить неоднозначность вызова между Универсальным. IList <T> .this [] и IList.this []?

Могут быть другие более быстрые / лучшие способы сделать это, но вы можете просто использовать строковый буфер и цикл for:

public String stringToAsterisk(String input) {
    if (input == null) return "";

    StringBuffer sb = new StringBuffer();
    for (int x = 0; x < input.length(); x++) {
        sb.append("*");
    }
    return sb.toString();
}

Если ваше приложение однопоточное, вы можете использовать StringBuilder вместо этого, но он не является потокобезопасным.

Я не уверен, что это может быть быстрее:

public String stringToAsterisk(String input) {
    if (input == null) return "";

    int length = input.length();
    char[] chars = new char[length];
    while (length > 0) chars[--length] = "*";
    return new String(chars);
}
7
задан Luigi 23 April 2014 в 06:17
поделиться

5 ответов

Вы не можете сделать этого с

public interface IMySpecialCollection : IList<MyObject>, IList { ... }

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

public class MySpecialCollection : IList<MyObject>, IList { ... }

IList<object> myspecialcollection = new MySpecialCollection(); IList list = (IList)myspecialcollection;

Вы рассмотрели наличие, IMySpecialCollection реализуют ISerializable для сериализации? Поддержка нескольких типов набора кажется немного неправильным мне. Можно также хотеть посмотреть на кастинг IList к IEnumerable для сериализации, так как IList просто переносит IEnumerable и ICollection.

3
ответ дан 7 December 2019 в 16:47
поделиться

Измените свою универсальную реализацию на...

T IList<T>.this[int index] { get; set; }

Это явно говорит, который 'это' который.

-1
ответ дан 7 December 2019 в 16:47
поделиться

К сожалению, Вы не можете объявить два индексатора с тем же списком параметров. Следующий параграф взят отсюда Руководство по программированию C# - Используя раздел "Remarks" Индексаторов:

Подпись индексатора состоит из числа и типов его формальных параметров. Это не включает тип индексатора или названия формальных параметров. Если Вы объявляете больше чем один индексатор в том же классе, у них должны быть различные подписи.

Необходимо будет объявить другой набор параметров, если Вы хотите использовать второй индексатор.

1
ответ дан 7 December 2019 в 16:47
поделиться

Список <T> подразумевает IList, таким образом, это - плохая идея использовать обоих в том же классе.

-2
ответ дан 7 December 2019 в 16:47
поделиться

Это обман , мой вопрос здесь

Подводя итог, если вы сделаете это, это решит проблему:

public Interface IMySpecialCollection : IList<MyObject>, IList
{
    new MyObject this[int index];
    ... 
}
2
ответ дан 7 December 2019 в 16:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: