C# 无法将T与K相加,因为它返回T(或泛型表示数字)

C# 无法将T与K相加,因为它返回T(或泛型表示数字),c#,generics,C#,Generics,我正在用C#、.NET Framework 4.7.1和Visual Studio 2017版本15.6.3开发一个类库 我有以下代码: public static T Add<T, K>(T x, K y) { dynamic dx = x, dy = y; return dx + dy; } genotype[index] = (T)_random.Next(1, Add<T, int>(_maxGeneValue, 1)); 我得到一个错误: C

我正在用C#、.NET Framework 4.7.1和Visual Studio 2017版本15.6.3开发一个类库

我有以下代码:

public static T Add<T, K>(T x, K y)
{
    dynamic dx = x, dy = y;
    return dx + dy;
}
genotype[index] = (T)_random.Next(1, Add<T, int>(_maxGeneValue, 1));
我得到一个错误:

CS0030无法将类型“int”转换为“T”

当我得到这个错误时,
T
是一个
字节

如何修复此错误?或者我可以随机更改
。下一步
以避免执行
添加

最小代码:

public class MyClass<T>
{
    private T[] genotype;
    private T _maxGeneValue;

    public void MinimalCode()
    {
        Random _random = new Random();
        genotype = new T[] {0, 0, 0};
        int index = 0;
        _maxGeneValue = 9;

        genotype[index] = (T)_random.Next(1, Add<T, int>(_maxGeneValue, 1));
    }
}
公共类MyClass
{
私有T[]基因型;
私有T_最大值;
公共代码()
{
随机_Random=新随机();
基因型=新的T[]{0,0,0};
int指数=0;
_maxGeneValue=9;
基因型[指数]=(T)_随机。下一步(1,加上(_最大基因值,1));
}
}
它是一个泛型类,因为
基因型
数组可以是字节、整数或浮点数。我使用random生成介于1和
\u maxGeneValue
之间的随机值。我需要添加一个,因为Random中的
maxValue
是独占的

据我所知,
generic
数组中的元素可以是任何内置类型。我不想为我将要使用的每种类型创建一个类(并且使用数组声明中最大的一个,即
long[]
,这是浪费空间)

T是一个泛型类,因为基因型数组可以是字节、整数或浮点数

这不是泛型的意思。泛型意味着存在大量未绑定的有效类型。您只有3个,这根本不符合通用解决方案的条件

这里学到的一个主要教训是:如果类型系统与您发生冲突,停下来好好想想,您可能做错了什么;对
dynamic
的演员阵容应该是一个巨大的危险信号

解决你的问题的办法就是简单地超载。您有3种有效类型:
byte
int
float
。我猜您希望避免丢失信息,因此以下内容应适用:

  • 如果添加整数类型,请使用可能的“最小”类型(这可能是潜在的“不安全”,因为它可能会溢出)
  • 如果其中一个操作数是浮点运算,请使用浮点算术
  • 好的,我们需要:

    public byte Add(byte left, byte right) { .... }
    public int Add(int left, int right) { .... }
    public float Add(float left, float right) { .... }
    

    现在想想别的事情:你想让两个字节的总和溢出吗?还是要返回一个
    int
    ?我的意思是:byte
    250
    +byte
    10
    应该返回什么?是
    字节
    还是
    整数
    ?如果是
    int
    ,请删除第一个重载。现在想想
    int
    s的同样问题。如果您不希望出现任何溢出,那么也请删除第二个重载。

    请发布一个。另外,请解释您希望随机性在这里做什么,如果底层的t真的是数字,为什么要尝试以通用方式处理它们?t是一个通用类,因为基因型数组可以是字节、整数或浮点。。这就是你的错误所在。这不是一般的。泛型意味着无限类型是允许的,3远远不是无限的。您的问题的解决方案是重载
    Add
    或定义一个方法,该方法接受所有可能的预期类型都可以隐式转换到的类型。从
    MyCode
    将严重失败的意义上讲,它仍然不是“泛型”的,但对您来说已经足够了。我可能会添加一个约束,即
    T
    必须是
    struct
    ,并在构造函数中验证
    T
    是受支持的类型之一。在C#中无法表示泛型T是“byte、integer或float”甚至“T是numeric type”。好吧,我想我误解了泛型的含义。谢谢但就我所知,
    基因型
    数组中的元素可以是任何内置类型。我不想为我将要使用的每种类型创建一个类(并且在数组声明中使用最大的一个类型是浪费空间)。但是(添加
    Add
    重载)对OP没有帮助,因为他有
    MyClass
    @Evk,但是
    class
    t
    只能是数字类型时,从一开始就是错误的。泛型并不适合这种情况。不存在使这合理可行的
    T:Numeric
    约束。没错,但这是另一回事。我的意思是,在当前情况下,添加多个
    Add
    不会有任何帮助,也不会修复任何问题。制作3个独立的类可以解决问题,但这不是OP想要的。
    public byte Add(byte left, byte right) { .... }
    public int Add(int left, int right) { .... }
    public float Add(float left, float right) { .... }