我正在使用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[]浪费空间).
T是泛型类,因为基因型数组可以是字节或整数或浮点数
这不是通用的意思.通用表示存在未绑定数量的有效类型.您只有3个,根本没有资格获得通用解决方案.
这里学到的一个重要教训是:如果类型系统与你作斗争,停下来思考它,你可能做错了什么; 演员dynamic应该是一个巨大的红旗.
你的问题的解决方案是简单地超载.你有3点有效的类型:byte,int和float.我猜你想避免丢失信息,所以以下内容应该成立:
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 相同的问题.如果您不想要任何溢出,那么也要删除第二个重载.