Syn*_*dog 21 c# generics constraints
可能重复:
仅对整数的C#泛型约束
映入眼帘!
我正在尝试在C#中设置笛卡尔坐标系,但我不想将自己限制为我的坐标值的任何一种数值类型.有时它们可能是整数,有时它们可能是有理数,取决于上下文.
这对我来说是"通用类",但我对如何将类型限制为积分和浮点感到难过.我似乎无法找到涵盖任何实数概念的课程......
public class Point<T> where T : [SomeClassThatIncludesBothIntsandFloats?] {
T myX, myY;
public Point(T x, T y) {
myX = x;
myY = y;
}
}
Point<int> pInt = new Point<int>(5, -10);
Point<float> pFloat = new Point<float>(3.14159, -0.2357);
Run Code Online (Sandbox Code Playgroud)
如果我想要这种自由度,那么当我在课堂上进行计算,除去bool,字符串,对象等时,我是否选择了"typeof(T)"噩梦?或者更糟糕的是,我是否选择为我想要使用的每种类型的数字创建一个类,每个都有相同的内部数学公式?
任何帮助,将不胜感激.谢谢!
Tho*_*rin 16
您无法定义此类约束,但可以在运行时检查类型.但这对你的计算没有帮助.
如果你想做计算,这样的事情是一个选择:
class Calculations<T, S> where S: Calculator<T>, new()
{
Calculator<T> _calculator = new S();
public T Square(T a)
{
return _calculator.Multiply(a, a);
}
}
abstract class Calculator<T>
{
public abstract T Multiply(T a, T b);
}
class IntCalculator : Calculator<int>
{
public override int Multiply(int a, int b)
{
return a * b;
}
}
Run Code Online (Sandbox Code Playgroud)
同样,定义一个FloatCalculator和您需要的任何操作.虽然比C#4.0 dynamic构造更快,但速度并不是特别快.
var calc = new Calculations<int, IntCalculator>();
var result = calc.Square(10);
Run Code Online (Sandbox Code Playgroud)
副作用是您只能实例化Calculator传递给它的类型是否具有匹配的Calculator<T>实现,因此您不必执行运行时类型检查.
这基本上是Hejlsberg在本次采访中提到的问题.我个人仍然希望看到某种基类型:)
Mar*_*ell 12
这是一个非常常见的问题; 如果您使用的是.NET 3.5,那么在MiscUtil中有很多支持,通过Operator类,它支持内置类型和任何带有运算符的自定义类型(包括"提升"运算符); 特别是,这允许使用泛型,例如:
public static T Sum<T>(this IEnumerable<T> source) {
T sum = Operator<T>.Zero;
foreach (T value in source) {
if (value != null) {
sum = Operator.Add(sum, value);
}
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
或者另一个例子; Complex<T>
这是一个已知问题,因为没有算术类来自同一个类.所以你不能限制它.
你唯一能做的就是
where T : struct
Run Code Online (Sandbox Code Playgroud)
但这不完全是你想要的.
以下是特定问题的链接.
算术类型如int,double,decimal应该实现IArithmetic<T>
| 归档时间: |
|
| 查看次数: |
18954 次 |
| 最近记录: |