首页 > 解决方案 > 在库函数中正确使用泛型 - 如何知道要给出什么类型

问题描述

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

该文档没有给出示例,但确实记录了如下语法。我正在尝试使用的方法:

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[])'

我究竟做错了什么?

标签: c#generics

解决方案


从泛型约束中,您可以看到类型 T 必须是集合类型 ( ICollection, IList, IEnumerable) 但它还必须实现IStructuralComparable,IStructuralEquatableICloneable接口。

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


推荐阅读