C# 无法将T与K相加,因为它返回T(或泛型表示数字)
我正在用C#、.NET Framework 4.7.1和Visual Studio 2017版本15.6.3开发一个类库 我有以下代码: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
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
?我的意思是:byte250
+byte10
应该返回什么?是字节
还是整数
?如果是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) { .... }