这就是我希望能够编写代码的方式。 MethodB在这里只是一个虚拟的,我们关心的是它返回类型T。
public static class ClassA<T> where T: struct, INumber<T>
{
public static T MethodA( T[][] matrix, T[] vector)
{
T result = T.Zero;
int m = matrix.Length;
for(int i = 0; i < m; i++)
{
result += MethodB( matrix[i], vector);
}
return result / ( m * 2 + 1);
}
public static T MethodB(T[] vector1, T[] vector2)
{
T result = T.One;
return result;
}
}
问题出在MethodA的return语句上。我遇到了 CS0019。为了解决这个问题,我想将 m 转换为 T 类型。我知道所有将要使用的 T 都将是数字,这应该允许构造函数使用 m 作为单个参数。所以我想有一种方法来转换 m。
我发现的问题的解决方法是:
public static class ClassA<T> where T: struct, INumber<T>
{
public static T MethodA( T[][] matrix, T[] vector)
{
T result = T.Zero;
int m = matrix.Length;
for(int i = 0; i < m; i++)
{
result += MethodB( matrix[i], vector);
}
T convertedM = CreateT( m * 2 + 1);
return result / convertedM;
}
public static T MethodB( T[] vector1, T[] vector2)
{
T result = T.One;
return result;
}
public static T CreateT( int i)
{
T type = new T();
if (type is double)
{
double d =(double) i;
return (T)((object)d);
}
if (type is float)
{
float d =(float) i;
return (T)((object)d);
}
//here would be a long list of different number types.
throw new NotImplementedException();
}
}
这对我来说似乎是一个次优的解决方案,因为我必须检查所有可能的类型。感觉我缺少明显的解决方案,比如有一个接口(interface)来确保所有 T 都实现 int 转换,但我不知道该怎么做。我希望能够添加不同的数字系统并使用该语言给出的数字。
我尝试过的:
- 我浏览了 INumbers 的文档,但找不到任何对这种情况有用的内容。
- 然后我找到了解决办法并实现了它,所以现在它至少可以工作了。
- 后来我尝试编写自己的接口(interface)并实现它,但我不知道如何为已经给出的东西(例如 double )实现接口(interface)。
最佳答案
您可以使用 CreateChecked
之一, CreateTruncating
或CreateSaturating
INumber<T>
上的方法类型。
例如:
return result / T.CreateChecked(m * 2 + 1);
CreateChecked:从值创建当前类型的实例,对于任何超出当前类型可表示范围的值抛出溢出异常。
CreateTruncating:根据值创建当前类型的实例,截断任何超出当前类型可表示范围的值。
CreateSaturating:根据值创建当前类型的实例,使超出当前类型可表示范围的任何值饱和。
关于c# - 如何将数字转换为泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75690951/