gpt4 book ai didi

c# - 如何在参数类型为 List 时传递 List

转载 作者:太空狗 更新时间:2023-10-29 18:15:19 28 4
gpt4 key购买 nike

我如何传递一个列表,该列表是一个 DerivedObjects 列表,其中方法需要一个 BaseObjects 列表。我正在转换列表 .ToList<BaseClass>()并且想知道是否有更好的方法。我的第二个问题是语法不正确。我正在尝试传递列表 byref,但出现错误:'ref' argument is not classified as a variable

如何解决这两个问题?谢谢。

public class BaseClass { }
public class DerivedClass : BaseClass { }

class Program
{
static void Main(string[] args)
{
List<DerivedClass> myDerivedList = new List<DerivedClass>();
PassList(ref myDerivedList.ToList<BaseClass>());
// SYNTAX ERROR ABOVE IS - 'ref' argument is not classified as a variable

Console.WriteLine(myDerivedList.Count);
}

public static void PassList(ref List<BaseClass> myList)
{
myList.Add(new DerivedClass());
Console.WriteLine(myList.Count);
}
}

已解决:

类似的方法解决了我的问题。

public static void PassList<T>(ref List<T> myList) where T : BaseClass
{
if (myList == null) myList = new List<T>();
// sorry, i know i left this out of the above example.

var x = Activator.CreateInstance(typeof(T), new object[] {}) as T;
myList.Add(x);
Console.WriteLine(myList.Count);
}

感谢所有帮助解决这个问题和其他 SO 问题的人。

最佳答案

ref部分很简单:要通过引用传递参数,基本上它必须是一个变量。所以你可以这样写:

List<BaseClass> tmp = myDerivedList.ToList<BaseClass>();
PassList(ref tmp);

...但这不会影响 myDerivedList 的值或内容本身。

ref无论如何,这是毫无意义的,因为您永远不会更改 myList 的值无论如何在方法内。了解更改参数值与更改参数值所指对象的内容之间的区别很重要。参见 my article on parameter passing了解更多详情。

现在至于为什么不能传入列表 - 这是为了保持类型安全。假设您可以这样做,我们可以这样写:

List<OtherDerivedClass> list = new List<OtherDerivedClass>();
PassList(list);

现在将尝试添加 DerivedClass 的实例到 List<OtherDerivedClass> - 这就像在一堆香蕉上加一个苹果……没用! C# 编译器会阻止您执行该不安全的操作——它不会让您将一串香蕉当作一个水果盘。假设我们确实Fruit而不是 BaseClass , 和 Banana/Apple作为两个派生类,带有 PassList添加 Apple到它给出的列表:

// This is fine - you can add an apple to a fruit bowl with no problems
List<Fruit> fruitBowl = new List<Fruit>();
PassList(fruitBowl);

// This wouldn't compile because the compiler doesn't "know" that in PassList
// you're only actually adding an apple.
List<Apple> bagOfApples = new List<Apple>();
PassList(bagOfApples);

// This is the dangerous situation, where you'd be trying to really violate
// type safety, inserting a non-Banana into a bunch of bananas. But the compiler
// can't tell the difference between this and the previous one, based only on
// the fact that you're trying to convert a List<Banana or Apple> to List<Fruit>
List<Banana> bunchOfBananas = new List<Banana>();
PassList(bunchOfBananas );

C# 4 在某些情况下允许generic variance - 但在这种特殊情况下它无济于事,因为您正在做一些根本不安全的事情。虽然通用方差是一个相当复杂的主题 - 由于您仍在学习参数传递的工作原理,我强烈建议您暂时不要管它,直到您对其余部分更有信心的语言。

关于c# - 如何在参数类型为 List<BaseClass> 时传递 List<DerivedClass>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7643211/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com