【发布时间】:2011-05-09 06:11:52
【问题描述】:
我第一次涉足泛型领域,并且对它们有所了解。我有一个方法旨在接受任何对象的两个列表,以各种方式匹配它们并返回匹配/不匹配的对象(方法内的东西可能在这里不是关键)。目的是接受任何类型的对象,无论是客户还是其他。但是,我在让它接受“字符串”时遇到了麻烦,我猜是因为它没有使用 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)'...
有什么方法可以让这个方法接受列表,不管它们是字符串还是其他类?或者将字符串列表放入将被接受的类型的快捷方式?
【问题讨论】:
-
你想达到什么目的?在代码中你写 var lastItem = new string(); string 没有无参数构造函数。所以,重新考虑你的算法。
-
感谢大家的cmets。所有的 cmets 都是正确的,我将 Marc's 标记为答案,因为它是第一个提出默认 (T) 想法的人。
-
非常感谢大家!我刚刚了解了 default(T)!
标签: c# generics argument-passing