Mar*_*cus 13 c# generics constraints
是否可以枚举通用约束中"可用"的类型?
T MyMethod<t>() where T : int, double, string
Run Code Online (Sandbox Code Playgroud)
为什么我要这样做是因为我有一个小的评估引擎,并希望编写如下代码:
bool expression.Evaluate<bool>();
Run Code Online (Sandbox Code Playgroud)
要么
int expression.Evaluate<int>();
Run Code Online (Sandbox Code Playgroud)
但我想禁止
MyCustomClass expression.Evalaute<MyCustomClass>();
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 10
如果泛型类型参数的可能性很小,那么该方法不是真正通用的.泛型的要点是允许对类型和方法进行参数化,以便您可以根据需要创建无限多种不同的类型和方法.如果您只有三种可能的类型,那么请编写三种方法.也就是说,创建重载,不要使用泛型.
无法将泛型参数限制为特定类型.
作为一种变通方法,您可以为每种类型提供一种方法,并将方法调用转发给一个通用实现:
public class Expression {
public bool EvaluateToBool() {
return Evaluate<bool>();
}
public int EvaluateToInt32() {
return Evaluate<int>();
}
private T Evaluate<T>() {
return default(T);
}
}
Run Code Online (Sandbox Code Playgroud)
另一方面,您是否考虑过在Expression类型中对表达式求值的类型进行编码?例如
public abstract class Expression<T> {
public abstract T Evaluate();
}
public sealed class AddExpression : Expression<int> {
public AddExpression(Expression<int> left, Expression<int> right) {
this.Left = left;
this.Right = right;
}
public Expression<int> Left { get; private set; }
public Expression<int> Right { get; private set; }
public override int Evaluate() {
return this.Left.Evaluate() + this.Right.Evaluate();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8045 次 |
最近记录: |