您将如何进行 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/

10-13 06:03