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