当我尝试使用泛型类时,this.value为T:
if (this.value.GetType() == typeof(int)) { ((int)this.value)++; } else { throw new InvalidOperationException ("T must be an int to perform this operation"); }
我得到一个编译时错误:"无法将类型'T'转换为'int'"
当它是int时,我该怎么做才能对this.value执行整数运算?
请注意,这只是一个例子.代码用泛型键入转换,"int"只是T的一种类型的示例.
不幸的是,很难让编译器相信特定的T实现.一种(讨厌的)方法是在中间转换为对象(注意这将是box和unbox值类型):
int i = (int)(object)this.value; i++; this.value = (T)(object)i;
丑陋但有效.在.NET 3.5中,我在这里有一些更好的泛型算术包装器.Operator类是MiscUtil的一部分; 在最简单的层面上,我怀疑AddAlternative可以很好地工作:
this.value = Operator.AddAlternative(this.value, 1);
这应该自动推断隐式
this.value = Operator.AddAlternative(this.value, 1);
好处:这比原始代码更好,因为它实际上并不关心原始T - 它适用于支持"T +(T,int)"的任何类型(甚至是您自己的).
我认为还有一个ChangeType隐藏在那里的某个地方......
[编辑] Collin K和其他人对建筑的含义做了有效的评论 - 但实际上有时候T确实很重要......但除非真的有必要,否则我同意避免这种类型的专业化.那说(根据我对Collin的帖子的评论),能够执行诸如基本算术(增量,Int32除法等)之类的事情(例如)Matrix
在我看来,泛型类中的特定于类型的代码是代码气味.我会重构它得到这样的东西:
public class MyClass{ ... } public class IntClass : MyClass { public void IncrementMe() { this.value++; } }