C#泛型约束可以枚举泛型约束中“可用”的类型吗?TMyMethod()whereT:int,double,string为什么我要这样做是因为我有一个小型评估引擎并且想编写这样的代码:boolexpression.Evaluate();或intexpression.Evaluate();但我想禁用MyCustomClassexpression.Evalaute();无法将泛型参数限制为特定类型。作为解决方法,您可以为每种类型提供一个方法并将方法调用转发给一个通用实现:publicclassExpression{publicboolEvaluateToBool(){returnEvaluate();}publicintEvaluateToInt32(){returnEvaluate();}privateTEvaluate(){returndefault(T);另一方面,您是否考虑过在Expression类型中对表达式求值的类型进行编码?例如publicabstractclassExpression{publicabstractTEvaluate();}publicsealedclassAddExpression:Expression{publicAddExpression(Expressionleft,Expressionright){this.Left=left;这个。对=对;}publicExpressionLeft{get;私有集;}公共表达权{get;私有集;}publicoverrideintEvaluate(){returnthis.Left.Evaluate()+this.Right.Evaluate();如果泛型类型参数出现的可能性很小,那么这个方法就不是真正的泛型。泛型的要点是允许类型和方法的参数化,以便您可以根据需要创建无限数量的不同类型和方法。如果你只有三种可能的类型,那就写三个方法。也就是说,创建重载,不要使用泛型。你不能。您可以添加以下通用约束:TMyMethod()whereT:struct{}然后:boolexpression.MyMethod();//OKintexpression.MyMethod();//OK字符串表达式.MyMethod();//失败!string是引用类型structMyStruct{}MyStructMyMethod();//好的!MyStruct是一个值类型classMyCustomClass{}MyCustomClassMyMethod();//失败!MyCustomClass是引用类型,但您不能同时添加int和string编译时约束。以上就是C#学习教程:C#泛型约束分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
