在库函数中正确使用泛型-如何知道要赋予的类型

时间:2019-04-26 06:13:50

标签: c# generics

我正在尝试使用需要在方法调用中指定泛型类型的库函数。
该方法应打开一个文件并提取大量一维浮点数组,并将它们返回给库中定义的一种字典。

该文档未提供示例,但确实记录了以下语法。 我正在尝试使用的方法:

public static NpzDictionary<T> Load<T>(byte[] bytes)
where T : class, ICloneable, IList, ICollection, IEnumerable, 
IStructuralComparable, IStructuralEquatable

http://accord-framework.net/docs/html/M_Accord_IO_NpzFormat_Load__1.htm

其中NpzDictionary类型定义为:

public class NpzDictionary<T> : IDisposable, 
    IEnumerable
where T : class, ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatab

http://accord-framework.net/docs/html/T_Accord_IO_NpzDictionary_1.htm

这里说T是要加载的数组的类型。

我期望使用浮点数组,所以我输入:

var ret = NpzFormat.Load<float>(byte_array);

但是我遇到以下错误:

The type 'float' must be a reference type in order to use it as parameter 'T' in the generic type or method 'NpzFormat.Load<T>(byte[])'

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

从一般约束中可以看到,类型T必须是集合类型(ICollection, IList, IEnumerable),但它也必须实现IStructuralComparableIStructuralEquatableICloneable接口。

据我所知,.Net框架中没有可实现所有这些类型的类型,因此您的库中有一个符合您自己实现这些要求的集合类型。