c# Generics<T>/constraints 问题

标签 c# .net

考虑以下例程,它通过构建一些默认行为(例如,没有空值,不将“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/

相关文章:

c# - 如何在 winforms 中使用 EF 进行双向数据绑定(bind)?

.net - az webapp 在指定 .net core 时创建错误

c# - FluentNHibernate SubClassMap 问题 : Discriminator fail

c# - MVC 项目中的解析器错误

c# - 在(不适用于)Windows 8 ARM 平板电脑上编译 C#

c# - 从 splitcontainer 面板显示 MDI child

.net 框架 3.5 源代码

c# - Unity 5.3.5f1在播放模式下崩溃

c# - .NET PrintDocument - 文本被截断

c# - SerializationInfo 实例永远不会为空?