如果可能的话,我有一个应该添加一堆泛型的函数。 否则,它返回它看到的最后一个通用的值。 我想循环遍历我的泛型列表,尝试添加它们,然后在无法添加它们时捕获异常。 我知道你不能尝试任何泛型的opperator,但我不明白为什么。 是不是尝试某种方法可能会失败,为什么尝试捕获是为了构建?
我很确定没有一个简单的方法,但如果有,请告诉我。
此外,有问题的代码:
T getValueAtTime(float time)
{
T toReturn = officalValue.Value;
float maxValue;
velocities.Sort();
foreach(ValueAtTime<T> toAdd in velocities)
{
if(toAdd.AtTime < time)
{
try
{
toReturn += toAdd.Value;
}
catch(OpperatorUnavailableError err)
{
toReturn = toReturn + toAdd.Value;
}
catch(Exception ex)
{
toReturn = toAdd.Value;
}
}
}
return toReturn;
}
答案 0 :(得分:1)
无论c#在通用中对try-catch的具体禁止,try catch都不应该是您标准操作方法的一部分。您的代码依赖于try-catch来克服障碍。这完全是对它的错误使用。 Try-catch用于测试可能因无法控制(或至少不可预测)的情况而失败的操作,并关闭或重试该操作。托管代码捕获错误是非常昂贵的,并不意味着它是一种逻辑控制机制。
修改我根据您的评论解释了您的问题,确实提出了另一种选择。您正在操作各种游戏对象。这不需要通用;它需要一个界面。如果您的所有对象都使用方法IhasValueAtTime
实现了接口float getValueAtTime(float time)
,那么您可以创建一个类似于float addTwoGetValueAtTimeObjectsSum(IhasValueAtTime item1, IhasValueAtTime item2)
的函数
答案 1 :(得分:0)
我认为问题是你期待不同的行为
toReturn += toAdd.Value
和toReturn = toReturn + toAdd.Value
。它们(几乎)完全相同。有关详细信息,请参阅此link。
因此,当您尝试抛出异常时,您的catch将抛出相同的异常。我认为你会做得更好。
T toReturn = officalValue.Value;
float maxValue;
velocities.Sort();
foreach(ValueAtTime<T> toAdd in velocities)
{
if(toAdd.AtTime < time)
{
try
{
toReturn += toAdd.Value;
}
catch(OpperatorUnavailableError err)
{
toReturn = toAdd.Value;
break;
}
}
}
return toReturn;
答案 2 :(得分:0)
我认为你的T
是包含你的方法的类/结构的泛型参数。现在,我不知道您对T
采用了哪些通用限制,但无法将T
限制为仅使+
运算符超载的类型。
因此,如果T
是通用参数,则无法执行此操作。
您使用T
的哪些类型?简单类型,如int
,double
和decimal
,对语言中的+
具有“本机”支持,或者用户定义的类型会使+
运算符超载?