任何人都可以告诉我是否有一种方法可以使用泛型来限制泛型类型参数T:
Int16Int32Int64UInt16UInt32UInt64我知道的where关键字,但无法找到一个接口只有这些类型,
就像是:
static bool IntegerFunction<T>(T value) where T : INumeric
Run Code Online (Sandbox Code Playgroud) 给出类似的泛型类定义
public class ConstrainedNumber<T> :
IEquatable<ConstrainedNumber<T>>,
IEquatable<T>,
IComparable<ConstrainedNumber<T>>,
IComparable<T>,
IComparable where T:struct, IComparable, IComparable<T>, IEquatable<T>
Run Code Online (Sandbox Code Playgroud)
如何为它定义算术运算符?
以下内容无法编译,因为'+'运算符不能应用于类型'T'和'T':
public static T operator +( ConstrainedNumber<T> x, ConstrainedNumber<T> y)
{
return x._value + y._value;
}
Run Code Online (Sandbox Code Playgroud)
正如您所见,泛型类型'T'受'where'关键字约束,但我需要对具有算术运算符的数字类型(IArithmetic?)进行约束.
'T'将是一个原始数字类型,如int,float等.这些类型是否存在'where'约束?
有没有办法声明泛型类型是type1 还是 type2 的泛型函数?
例:
public void Foo<T>(T number)
{
}
Run Code Online (Sandbox Code Playgroud)
我可以将T约束为int或long
是否有可能约束的方法,使得其只接收int,double,long或其他数字类型,其具有通常的数值运算(例如+,-,*,/)中所定义?
我正在使用C#在OS X上使用Unity 3.4.2进行编程.
我有一个类如下:
class Foo<T>
{
public T DoFoo(T bar)
{
float aFloatValue = 1.0f;
// Do other stuff...
return aFloatValue * bar;
}
}
Run Code Online (Sandbox Code Playgroud)
当Unity编译这个类时,它会给我这个错误信息:
错误CS0019:运算符
*' cannot be applied to operands of type浮点'和'T'
我知道我为T提供的类型将支持浮点乘法.在这种情况下如何实现泛型乘法?
我正在一个小型教育项目中工作,我们必须实现一个n维矩阵.根据上下文,此矩阵可以使用我们自己的内置ComplexNumber结构,System.Double也可以使用非常简单的示例,使用整数类型(主要是System.Int32).
由于应用程序的性质,我们不需要实现闪电般快速的性能.
因此,我的第一个想法是实行Matrix<T>地方T会以某种方式需要被限制在"数字".
这样做的一个明显问题是,语言中没有办法T用定义的运算符约束泛型类型.此外,我没有看到一种简单的方法来重新T合理到合理的类型.
我的问题是:
有人可以指出我的优雅方式,使用通用类型进行数学运算,不会过多地影响性能,并以某种方式使内置类型工作(如果可能).
如果Eric读过这篇文章,那么这个功能(通过定义的运算符约束泛型类型)是否会出现在C#设计会议的假设未来版本中,并且它是否已经接近将其纳入语言?
我知道实现一个ComplexMatrix类型并为每个矩阵"子类型"(双重,整数等)创建包装器更容易,更好,并支付我们的复杂类型和矩阵元素发生的任何类型之间的转换的性能成本成为.这个问题更多的是出于对某人如何实施类似场景的好奇心.
以下代码非常重复:
public static double Interpolate(double x1, double y1, double x2, double y2, double x)
{
return y1 + (x - x1) * (y2 - y1) / (x2 - x1);
}
public static decimal Interpolate(decimal x1, decimal y1, decimal x2, decimal y2, decimal x)
{
return y1 + (x - x1) * (y2 - y1) / (x2 - x1);
}
Run Code Online (Sandbox Code Playgroud)
但是,我尝试使用泛型不会编译:
public static T Interpolate<T>(T x1, T y1, T x2, T y2, T x)
{
return y1 + (x - x1) …Run Code Online (Sandbox Code Playgroud) 我在NumbericUpDown控件上构建了一个包装器.包装器是通用的,可以支持int吗?加倍?
我想写一个方法,将执行以下操作.
public partial class NullableNumericUpDown<T> : UserControl where T : struct
{
private NumbericUpDown numericUpDown;
private T? Getvalue()
{
T? value = numericUpDown.Value as T?; // <-- this is null :) thus my question
return value;
}}
Run Code Online (Sandbox Code Playgroud)
当然小数和双数之间没有强制转换?还是int?所以我需要使用某种转换方式.我想避免切换或if表达式.
你会怎么做?
为了澄清我的问题,我提供了更多代码......
是否有任何好的解决方案来表示参数化的枚举C# 3.0?我正在寻找像OCaml或Haxe这样的东西.我只能想到具有简单枚举字段的类层次结构,以便于现在轻松切换,也许有更好的想法?
请参阅下面的其中一个回复中的Ocaml示例,以下是Haxe代码:
enum Tree {
Node(left: Tree, right: Tree);
Leaf(val: Int);
}
Run Code Online (Sandbox Code Playgroud) 我知道理论,它们很棒,框架中包含的那些简化了很多事情,甚至具有性能提升。
关于这个主题的答案很多,有很好的例子,但对我或框架中已经存在的例子通常没有什么实际价值。
问题是,在哪种情况下您决定编写自己的使用泛型的类?
我想创建泛型函数Math.Abs()但我不知道如何做到这一点.如果我创建一个类Math我不能为T值创建方法Abs,因为我不知道T的类型.
如果有人知道怎么做?
谢谢