gpt4 book ai didi

C# 泛型 : Passing List to a method that expects a List

转载 作者:太空狗 更新时间:2023-10-29 22:14:48 25 4
gpt4 key购买 nike

我第一次涉足泛型,对它们有一点了解。我有一个方法旨在接受任何对象的两个列表,以各种方式匹配它们并返回匹配/不匹配的对象(方法中的内容可能不是这里的关键)。目的是接受任何类型的对象,无论是客户还是其他任何对象。但是,我在让它接受“字符串”时遇到了障碍,我猜是因为它没有用 new() 关键字初始化,而且不像普通的实例化类。

所以,我有一个这样的方法声明:

public static compareResult<T> stepCompare<T>(List<T> leftList, List<T> rightList, Comparison<T> IDComparer = null, Comparison<T> lowLevelComparer = null, bool confirmUniqueness = true) where T : IComparable, new()

诚然,在末尾添加 where 子句是为了响应错误“无法创建变量类型 'T' 的实例,因为它没有 new() 约束”。这出现在方法中的一行

T lastItem = new T();

但是,现在如果我尝试将它传递给两个 Lists<string> ,它说“'string' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'MF.Comparers.stepCompare<T>(System.Collections.Generic.List<T>, System.Collections.Generic.List<T>, System.Comparison<T>, System.Comparison<T>, bool)' ...

有什么方法可以让这个方法接受列表,无论它们是字符串还是其他类?或者将字符串列表放入将被接受的类型的快捷方式?

最佳答案

你不能制作string满足new()约束,没有。同时 string 一个普通类,可以使用构造函数以完全正常的方式创建实例,它没有无参数构造函数。

最好的方法实际上取决于为什么你有那行代码,包括lastItem .如果你只想要一些默认值,那么 default(T)可能是最好的方法。

如果你真的确实想创建一个新的T实例, 那么你应该接受 Func<T>在方法的参数列表中,作为按需创建默认值的一种方式。或者,如果您愿意使用特定的单个值作为默认值,则可以只添加类型为 T 的参数。 .如果没有看到您的其余代码,很难说。

关于C# 泛型 : Passing List<string> to a method that expects a List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933182/

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