【问题标题】:c# Generics: Passing List<string> to a method that expects a List<T>c# 泛型:将 List<string> 传递给需要 List<T> 的方法
【发布时间】: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&lt;string&gt;,它会显示“'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&lt;T&gt;(System.Collections.Generic.List&lt;T&gt;, System.Collections.Generic.List&lt;T&gt;, System.Comparison&lt;T&gt;, System.Comparison&lt;T&gt;, bool)'...

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

【问题讨论】:

  • 你想达到什么目的?在代码中你写 var lastItem = new string(); string 没有无参数构造函数。所以,重新考虑你的算法。
  • 感谢大家的cmets。所有的 cmets 都是正确的,我将 Marc's 标记为答案,因为它是第一个提出默认 (T) 想法的人。
  • 非常感谢大家!我刚刚了解了 default(T)!

标签: c# generics argument-passing


【解决方案1】:

你不能让string 满足new() 约束,不。虽然string 是一个普通的类,并且可以使用构造函数以完全正常的方式创建实例,但它没有无参数的构造函数。

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

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

【讨论】:

  • 太好了,谢谢乔恩!我设置了 default(T),它就像一个魅力。干杯
【解决方案2】:

如果你想要任何对象,你可能不得不在没有new T() 的情况下生活。您可以结合使用反射、特殊情况(用于string 等)和Activator.CreateInstance&lt;T&gt;() - 但是,IMO 您应该将自己(在这种情况下)限制为default(T) ,对于引用类型(包括字符串)和可为空的值类型,这将为 null,而对于不可为空的值类型,则为全零。您还应该使用bool 或类似名称来确保您实际上没有使用该值,除非满足编译器的明确分配规则。

【讨论】:

  • 是的,就是这样。有趣的是,我在另一个地方遇到了问题,并将其更改为 default(T),但在几个地方留下了 new()。感谢小伙伴的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2017-03-11
相关资源
最近更新 更多