通过引用接受ref ICollection <t>

时间:2018-01-19 23:44:39

标签: c# pass-by-reference c#-7.0

我注意到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 个答案:

答案 0 :(得分:1)

使用ref有可能(并且确定无误)您将为传入的属性分配一个新对象。在这种情况下,任何类型ICollection<T>。如果传入类型为List<T>的对象,则最终可能会分配一个实现ICollection<T>的无关类型的对象。 c#类型系统不允许这样做,编译器知道这一点,因此阻止你这样做