考虑以下例程,它通过构建一些默认行为(例如,没有空值,不将“1,1,1”解析为有效数字)来简化我的生活:
public static Double CvtToDouble(Object O)
{
if (O == null) return (Double)0;
if (O == System.DBNull) return (Double)0;
if (O is string) return Double.Parse((String)O,
System.Globalization.NumberStyles.Float);
return (T)O;
}
然后对所有 num 类型重复此例程。我想通过将它们全部组合成来节省打字和拼写错误
public static T CvtTo<T>(Object O) : where T : "is one of Int32, Int16 ..."
通常的“where T: struct”约束在这里是不够的,因为“return (T)0”语句对任意值类型无效。似乎应该有某种方法可以在不向后弯腰的情况下将其通用化,但我没有看到。我错过了什么?
最佳答案
你做不到。
.NET 中的泛型不是模板,它们只编译一次,因此必须在编译时合法,而不是在调用时合法。
因为没有 where T : number
约束,或者没有 where T : op_add()
约束,你不能只用泛型来做到这一点,你要么需要重载或运行时检查来执行此操作。
关于c# Generics<T>/constraints 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5511833/