public T MyAlgorithm<T>(T x, T y) where T : struct, IConvertible { if (typeof(T) == typeof(DateTime)) //手动排除不可运算的值类型... { throw new ArgumentException("T"); }
用vb.net的后期绑定可以很简单的解决这些问题,直接写 Return x * x + y * y 就可以了(注意用后期绑定方式编译) 将编译成使用Microsoft.VisualBasic.CompilerServices.Operators里面的Add等方法的调用不知道,这贴的目的何在 如果,就是为了实现T的+-*/(包括与常数之间),用VB.net的后期绑定就可以了,不想用vb.net,也可以直接用Microsoft.VisualBasic.CompilerServices.Operators也可以解决问题 如果,要效率,直接重载最高效,其他方式都不怎么样
public static T max(T t1, T t2) { return Convert.ToDouble(t1) > Convert.ToSingle(t2) ? t1 : t2; } 这样运算行不行?
首先针对T加类型限定: T MyAlgorithm<T>(T x, T y) wher T: B B 必须为引用类型,同时B有针对 + 运算做操作符重载。 那么这种方式就限定死了 T 类型必须为引用类型,那么 int, decimal, float这些都不行了。
public T intSum<T>(T x, T y) { if (x.GetType().Equals("Int32") && y.GetType().Equals("Int32")) { int result; result = Convert.ToInt32(x) + Convert.ToInt32(y); return result; } else { Console.Write("参数类型不正确!"); } } 怎么样解决 返回值的类型不同呢
继承object类,在用 typeof 里面分情况进行强制转换并进行计算,不过
我没有试过
// System.Int32 结构
[SerializableAttribute]
[ComVisibleAttribute(true)]
public struct Int32 : IComparable, IFormattable,
IConvertible, IComparable<int>, IEquatable<int>// System.Double 结构
[SerializableAttribute]
[ComVisibleAttribute(true)]
public struct Double : IComparable, IFormattable,
IConvertible, IComparable<double>, IEquatable<double>是不是可以考虑加个这方面的特性(Attribute)?
如果不是整型,就没有取模(%),逻辑与、或、异或(&、 ¦、^),移位( < <、> > )这些运算。而大小比较可以通过IComparable<>来实现。所以就剩下+-*/这写四则运算问题了。
从object级别解决问题,就是效率不怎么样
if(a大于b)return 1;否则返回-1;相等时是0
}这样代码简洁。例如: L.Sort(
delegate(KeyValuePair <String, int> a, KeyValuePair <String, int> b)
{
return (a.Value - b.Value);
}
);
如果不用上面的,就要这样写,增加一个类:
internal class myCompare : System.Collections.Generic.IComparer <KeyValuePair <String, int> >
{ public int Compare(KeyValuePair <String, int> a, KeyValuePair <String, int> b)
{
return (a.Value - b.Value);
}
}
//凋用的地方这样写:
myCompare mp=new myCompare();
L.Sort(mp.Compare);
{
static void Main()
{
Console.WriteLine(Max(1)); // 输出: 1
Console.WriteLine(Max(.3, -.5)); // 输出: 0.3
Console.WriteLine(Max(0M, -3M, 3.14M)); // 输出: 3.14
Console.WriteLine(Max(9f, -1f, 3.14f, -2.718f)); // 输出: 9
Console.WriteLine(Max(0u, 23u, 3114u, 120718u, 5678u)); // 输出: 120718
} static T? Max<T>(params T[] x)
where T: struct, IComparable
{
if (x.Length == 0) return null;
T a = x[0];
foreach (T i in x)
if (a.CompareTo(i) < 0) a = i;
return a;
}
}
{
if (typeof(T) == typeof(DateTime)) //手动排除不可运算的值类型...
{
throw new ArgumentException("T");
}
return x + y; //或者使用 IConvertible 辅助处理...
}
Return x * x + y * y
就可以了(注意用后期绑定方式编译)
将编译成使用Microsoft.VisualBasic.CompilerServices.Operators里面的Add等方法的调用不知道,这贴的目的何在
如果,就是为了实现T的+-*/(包括与常数之间),用VB.net的后期绑定就可以了,不想用vb.net,也可以直接用Microsoft.VisualBasic.CompilerServices.Operators也可以解决问题
如果,要效率,直接重载最高效,其他方式都不怎么样
实际上你提供的就是后期绑定的方案,关键是当期版本的后期绑定总是使用纯反射调用,性能非常不堪。我将会把我暂时的方案贴出来,是已经解决了内置类型和所有全面重载四则运算符类型(如Decimal)的版本。
http://catouse.com/?p=21
不知道这样实现有没有错
{
return Convert.ToDouble(t1) > Convert.ToSingle(t2) ? t1 : t2;
}
这样运算行不行?
T MyAlgorithm<T>(T x, T y) wher T: B
B 必须为引用类型,同时B有针对 + 运算做操作符重载。
那么这种方式就限定死了 T 类型必须为引用类型,那么 int, decimal, float这些都不行了。
{
if (x.GetType().Equals("Int32") && y.GetType().Equals("Int32"))
{
int result;
result = Convert.ToInt32(x) + Convert.ToInt32(y);
return result;
}
else
{
Console.Write("参数类型不正确!");
}
}
怎么样解决 返回值的类型不同呢