c# - 如何将数字转换为泛型类型?

标签 c# generics interface type-conversion

这就是我希望能够编写代码的方式。 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 转换,但我不知道该怎么做。我希望能够添加不同的数字系统并使用该语言给出的数字。

我尝试过的:

  1. 我浏览了 INumbers 的文档,但找不到任何对这种情况有用的内容。
  2. 然后我找到了解决办法并实现了它,所以现在它至少可以工作了。
  3. 后来我尝试编写自己的接口(interface)并实现它,但我不知道如何为已经给出的东西(例如 double )实现接口(interface)。

最佳答案

您可以使用 CreateChecked 之一, CreateTruncatingCreateSaturating INumber<T> 上的方法类型。

例如:

return result / T.CreateChecked(m * 2 + 1);

CreateChecked:从值创建当前类型的实例,对于任何超出当前类型可表示范围的值抛出溢出异常。

CreateTruncating:根据值创建当前类型的实例,截断任何超出当前类型可表示范围的值。

CreateSaturating:根据值创建当前类型的实例,使超出当前类型可表示范围的任何值饱和。

关于c# - 如何将数字转换为泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75690951/

相关文章:

c# - 为什么在 LINQ 中使用 First 而不是 FirstOrDefault?

c# - AutoMapper 跳过所有空属性,然后允许一些空值

c# - 我对 IComparable 和集合排序方法有疑问

java泛型,未经检查的警告

c# - ASP.NET MVC 5 页面在数据库调用时挂起

generics - 为什么要使用声明网站差异

c# - 向接口(interface)添加属性会阻止在派生类型中创建私有(private)/ protected "set"吗?

delphi - 释放 DLL 中的接口(interface)对象时无效的指针操作

java - 注入(inject)具有多个实现的接口(interface)的目的

c# webservice 调用,缓冲区太小(异步?)