我是一个尝试使用C#泛型的C++开发者。
我的最终目标是在C#中模拟模板特化。
换句话说,我希望为所有类型提供一个默认函数实现,并为特定类型提供一个特定实现。
我的第一次尝试是使用泛型和扩展方法,但似乎C#的泛型是在运行时解析的,这给出了这种奇怪的结果(至少对于一个C++程序员来说是奇怪的):
通常在C#中处理这种情况的常见方法是什么?
编辑:
尝试实现@Enigmativity的建议,但没有成功。
换句话说,我希望为所有类型提供一个默认函数实现,并为特定类型提供一个特定实现。
我的第一次尝试是使用泛型和扩展方法,但似乎C#的泛型是在运行时解析的,这给出了这种奇怪的结果(至少对于一个C++程序员来说是奇怪的):
//any of my classes
public class MyClass
{
}
//class extension for my classes only
public static class MyClassExt
{
public static string GetCaption(this MyClass c)
{
return "MyClass caption";
}
}
//"default" extension for all
public static class objectExt
{
public static string GetCaption(this object o)
{
return $"object caption {o}";
}
}
internal class Program
{
public static string GetCaption<T>(T t)
{
//Isn't it supposed to call MyClassExt.GetCaption if t is MyClass ?
return t.GetCaption();
}
static void Main(string[] args)
{
int i = 0;
Console.WriteLine(i.GetCaption()); //> object caption 0
Console.WriteLine(new MyClass().GetCaption()); //> MyClass caption
//calls GetCaption<T> with T is MyClass
Console.WriteLine(GetCaption(new MyClass())); //> object caption csharpconsole.MyClass
}
}
通常在C#中处理这种情况的常见方法是什么?
编辑:
尝试实现@Enigmativity的建议,但没有成功。
//class extension for my classes only
public static class MyClassExt
{
//My attempt for @Enigmativity suggestion
public static string GetCaption<T>(this T t) where T : MyClass
{
return "MyClass caption";
}
}
//"default" extension for all
public static class objectExt
{
public static string GetCaption(this object o)
{
return $"object caption {o}";
}
}
internal class Program
{
public static string GetCaption<T>(T t)
{
//Isn't it supposed to call MyClassExt.GetCaption if t is MyClass ?
return t.GetCaption();
}
static void Main(string[] args)
{
int i = 0;
Console.WriteLine(i.GetCaption()); //> object caption 0
Console.WriteLine(new MyClass().GetCaption()); //> MyClass caption
//calls GetCaption<T> with T is MyClass
Console.WriteLine(GetCaption(new MyClass())); //> object caption csharpconsole.MyClass
}
}
MyClass
不直接拥有一个GetCaption
方法呢?或许它应该是一个接口? - undefined