您将如何进行 C# 特化?
我会提出问题。你有一个模板类型,你不知道它是什么。但是您确实知道它是否源自 XYZ
您想调用 .alternativeFunc()
。一个很好的方法是调用一个专门的函数或类并让 normalCall
返回 .normalFunc()
而对任何派生类型 XYZ
的其他特化调用 0x2518124313431这将如何在 C# 中完成?
最佳答案
在 C# 中,最接近特化的是使用更具体的重载;然而,这很脆弱,并没有涵盖所有可能的用法。例如:
void Foo<T>(T value) {Console.WriteLine("General method");}
void Foo(Bar value) {Console.WriteLine("Specialized method");}
在这里,如果编译器在编译时知道类型,它将选择最具体的:
Bar bar = new Bar();
Foo(bar); // uses the specialized method
然而....
void Test<TSomething>(TSomething value) {
Foo(value);
}
即使对于
Foo<T>
也将使用 TSomething=Bar
,因为这是在编译时烧录的。另一种方法是在泛型方法中使用类型测试 - 然而,这通常是一个糟糕的主意,不推荐。
基本上,C# 只是不希望你使用特化,除了多态:
class SomeBase { public virtual void Foo() {...}}
class Bar : SomeBase { public override void Foo() {...}}
这里
Bar.Foo
将始终解析为正确的覆盖。关于c# - 如何在 C# 中进行模板特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/600978/