Передача списка<T> по ссылке на метод, принимающий ref ICollection<T>

Я заметил, что List<T> не может быть передано таким методам, как:

  • Foo<T>(ref ICollection<T> bar)
  • Foo<T>(out ICollection<T> bar)

Принимая во внимание, что, с другой стороны, Foo<T>(ICollection<T> bar) принимает List<T> в качестве аргумента, может ли кто-нибудь объяснить мне описанное поведение?

Полный пример:

public class AuxClass { }

public class Test
{
    private void NonRefFoo<T>(ICollection<T> intCollection) {; }
    private void RefFoo<T>(ref ICollection<T> intCollection) {; }
    private void OutFoo<T>(out ICollection<T> intCollection) { intCollection = null; }

    public void Foo()
    {
        {
            List<int> list = new List<int>() { 0, 1, 2, 3, 5, 8, 13 };
            List<AuxClass> classList = new List<AuxClass>() { new AuxClass() };

            NonRefFoo<int>(list);
            RefFoo<int>(ref list);                                  // Invalid
            OutFoo<AuxClass>(out List<int> outListInt);             // Invalid

            NonRefFoo<AuxClass>(classList);
            RefFoo<AuxClass>(ref classList);                        // Invalid
            OutFoo<AuxClass>(out List<AuxClass> outListClass);      // Invalid
        }

        {
            ICollection<int> collection = new List<int>() { 0, 1, 2, 3, 5, 8, 13 };
            ICollection<AuxClass> classCollection = new List<AuxClass>() { new AuxClass() };

            NonRefFoo<int>(collection);
            OutFoo<int>(out ICollection<int> outCollectionInt);
            RefFoo<int>(ref collection);

            NonRefFoo<AuxClass>(classCollection);
            RefFoo<AuxClass>(ref classCollection);
            OutFoo<AuxClass>(out ICollection<AuxClass> outCollectionClass);
        }
    }
}

заранее спасибо

1 ответ

Решение

С помощью ссылки есть возможность (и без определенности), что вы назначите новый объект для свойства, которое вы передаете. В этом случае что-нибудь типа ICollection<T>, Если вы передаете объект типа List<T> Вы могли бы в конечном итоге назначить объект несвязанного типа, который реализует ICollection<T>, Система типов C# не позволяет этого, и компилятор это знает и поэтому останавливает это

Другие вопросы по тегам