通过引用接受 ref ICollection<T> 的方法传递 List<T>
Passing List<T> by reference to a method accepting 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);
}
}
}
提前致谢
使用 ref 有可能(并且不确定)您将向传入的 属性 分配一个新对象。在这种情况下,任何 ICollection<T>
类型的对象。如果你传入一个 List<T>
类型的对象,你最终可能会分配一个实现 ICollection<T>
的不相关类型的对象。 C# 类型系统不允许这样做,编译器知道这一点,所以会阻止你这样做
我注意到 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);
}
}
}
提前致谢
使用 ref 有可能(并且不确定)您将向传入的 属性 分配一个新对象。在这种情况下,任何 ICollection<T>
类型的对象。如果你传入一个 List<T>
类型的对象,你最终可能会分配一个实现 ICollection<T>
的不相关类型的对象。 C# 类型系统不允许这样做,编译器知道这一点,所以会阻止你这样做