无法使用K添加T,因为它返回T(或数字的通用)

Van*_*nel 4 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用此代码:

genotype[index] = (T)_random.Next(1, Add<T, int>(_maxGeneValue, 1));
Run Code Online (Sandbox Code Playgroud)

genotype是一个T[].

我收到错误:

参数2:无法从'T'转换为'int'

但是,如果我更改代码:

public static K Add<T, K>(T x, K y)
{
    dynamic dx = x, dy = y;
    return dx + dy;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

CS0030无法将类型'int'转换为'T'

当我得到这个错误T是一个byte.

我该如何解决这个错误?或者也许我可以改变random.Next以避免这样做Add.

最小代码:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

它是泛型类,因为genotype数组可以是字节或整数或浮点数.我使用random来生成1和1之间的随机值_maxGeneValue.我需要添加一个,因为maxValue在Random中是独占的.

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

InB*_*een 6

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

这不是通用的意思.通用表示存在未绑定数量的有效类型.您只有3个,根本没有资格获得通用解决方案.

这里学到的一个重要教训是:如果类型系统与你作斗争,停下来思考它,你可能做错了什么; 演员dynamic应该是一个巨大的红旗.

你的问题的解决方案是简单地超载.你有3点有效的类型:byte,intfloat.我猜你想避免丢失信息,所以以下内容应该成立:

  1. 如果添加整数类型,请使用"最小"的可能类型(从可能溢出的角度来看,这可能是"不安全的").
  2. 如果其中一个操作数是a float,则使用浮点算术.

好的,所以我们需要:

public byte Add(byte left, byte right) { .... }
public int Add(int left, int right) { .... }
public float Add(float left, float right) { .... }
Run Code Online (Sandbox Code Playgroud)

现在想想别的东西:你想要两个字节的总和溢出吗?或者你想要回归int?我的意思是:字节250+字节应10返回什么?A byte还是int?如果是int,则删除第一个过载.现在想想与ints 相同的问题.如果您不想要任何溢出,那么也要删除第二个重载.