Не может неявно преобразовать Список <T> в Набор <T>

Попробуйте этот код

static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) {
    while (toCheck != null && toCheck != typeof(object)) {
        var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
        if (generic == cur) {
            return true;
        }
        toCheck = toCheck.BaseType;
    }
    return false;
}
41
задан Jon Skeet 8 February 2009 в 05:41
поделиться

4 ответа

List<T> не происходит от Collection<T> - это действительно, однако, реализует ICollection<T>. Это было бы лучшим выбором типа возврата.

Что касается new List<int>(some collection<int>) вопрос - это частично зависит от того, каков набор. Если это реализует ICollection<T> (во время выполнения) затем, конструктор может использовать Count свойство для создания списка с правильной начальной способностью прежде, чем выполнить итерации через него и добавить каждый объект. Если это не реализует ICollection<T> затем, это просто эквивалентно:

List<int> list = new List<int>();
foreach (int x in otherCollection)
{
    list.Add(x);
}

Все еще хороший иметь в удобном конструкторе, но не чрезвычайно эффективное - это не может быть, действительно.

я не полагаю, что конструктор делает что-либо хитрость для массивов, которые она потенциально могла - использование Array.Copy или безотносительно просто скопировать партию сразу вместо итерации все же. (Аналогично, если бы это был другой List<T>, то это могло бы достигнуть вспомогательный массив и копию настолько непосредственно.)

36
ответ дан Jon Skeet 23 September 2019 в 14:52
поделиться

List<T> не наследовался от Collection<T>. Простой и простой. Если List<T> не обеспечивает оператор для неявного преобразования в Collection<T>, Вы не можете сделать этого. Я на самом деле предложил бы возвратиться List<T>, если Вы можете, поскольку я полагаю, что правила проходят примерно так:

Принимают в качестве параметра наименьшее количество возможного интерфейса constrictive. Возвратитесь как возвращаемый параметр большая часть возможного типа constrictive.

6
ответ дан Jon Skeet 23 September 2019 в 14:52
поделиться

Here is a generic extension method written in C# 3.0 used to convert List to Collection

using System.Collections.Generic;
using System.Collections.ObjectModel;

public static class ExtensionMethods
{
    public static Collection<T> ToCollection<T>(this List<T> items)
    {
        Collection<T> collection = new Collection<T>();

        for (int i = 0; i < items.Count; i++)
        {
            collection.Add(items[i]);
        }

        return collection;
    }
}

and it is used like this…

List<string> entities = new List<string>();
entities.Add("Value 1");
entities.Add("Value 2");
entities.Add("Value 3");
entities.Add("Value 4");

Collection<string> convertedEntities = entities.ToCollection<string>();
4
ответ дан 26 November 2019 в 23:18
поделиться

Почему бы просто не сделать следующее:

Collection<string> collection = new Collection<string>(theList);

as Collection (вход IList) принимает список как часть конструкции.

94
ответ дан 26 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

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