我想在C#中最接近的可能是:
class GenericPrinter<T>
{
public virtual void Print()
{
Console.WriteLine("Unspecialized method");
}
}
class IntPrinter : GenericPrinter<int>
{
public override void Print()
{
Console.WriteLine("Specialized with int");
}
}
否则,答案是你不能专门从事C#。
正如Lyubomyr Shaydariv在他的评论中所说:
“C++模板不是.NET泛型。 你做不到。”
从您的编辑中,我猜您将进行某种类型检查。
例如,您可以使用字典来完成此操作。
class GenericPrinter<T>
{
private Dictionary<Type, Action> _actions
= new Dictionary<Type, Action>()
{
{ typeof(int), PrintInt }
};
public virtual void Print()
{
foreach (var pair in _actions)
if (pair.First == typeof(T))
{
pair.Second();
return ;
}
Console.WriteLine("Unspecialized method");
}
public virtual void PrintInt()
{
Console.WriteLine("Specialized with int");
}
}
如您所见,您需要为每种类型创建一个方法来处理它们。当您尝试将T作为int进行操作时,您可能会遇到一些问题。由于T是真正的泛型(它没有任何限制),因此它更有可能在您的代码中作为对象(而不是在运行时),您需要像这样进行强制转换:(int)(object)yourTVariable在您确定T是int的方法中。
但对于这部分内容,我想我的同行们会比我给您提供更好的答案。
如果只是为了显示您正在使用的类型:
public virtual void Print()
{
Console.WriteLine($"Specialized with {typeof(T).Name}");
}
但是你将不再拥有未特化的信息(如果你仔细想一想,你不能实例化一个没有指定类型的GenericPrinter。那么有一个显示“未特化”的方法就没有意义了,你总是会有一个指定的类型)。
无论如何,答案仍然是相同的,你不能在C#中专门化一个泛型。