在C#中,我希望有一个泛型类的不同行为方式的方法,使用类似于显式模板专业化的东西
我从相关员额中看到,使用扩展在C#中可能会出现这样的情况,但我的代码并没有达到预期的效果:我希望Thing<int>::Method()有一种行为,当<T>不是<int>时,需要另一种行为。
我有过
using System;
public interface IThing
{
void Method();
}
public class Thing<T> : IThing
{
public void Method()
{
this.Specialization<T>();
}
}
public static class ThingExtensions
{
public static void Specialization<T>(this Thing<T> cls)
{
Console.WriteLine("Thing<T> specialization");
return;
}
public static void Specialization(this Thing<int> cls)
{
Console.WriteLine("Thing<int> specialization");
return;
}
}
public class Program
{
public static void Main()
{
var t = new Thing<float>();
t.Method();
t.Specialization();
var i = new Thing<int>();
i.Method();
i.Specialization();
}
}但是这个输出
Thing<T> specialization
Thing<T> specialization
Thing<T> specialization
Thing<int> specialization而不是
Thing<T> specialization
Thing<T> specialization
Thing<int> specialization
Thing<int> specialization显而易见的问题是“为什么不直接调用Specialization<T>而不是Method呢?”希望我包含了接口类--我正在努力适应它的框架。
我可以看出Specialization<T>与Specialization<int>是匹配的,但我很惊讶后者没有被认为是更好的匹配!
发布于 2018-11-26 15:00:11
不幸的是,当您调用Method()时,它正在以Thing<T>的形式运行,而不知道它是Thing<int>。您可以使用反射来找出这一点,或者(更好的主意):
if(this instanceof Thing<int> x)
x.Specialisation();
else
this.Specialisation();或者,您可以声明Method()为virtual,并使用override void Method(){...}创建IntThing : Thing<int>。
发布于 2018-11-26 15:03:15
编译包含方法时解析对this.Specialization<T>();的调用。在这一点上,T是任何东西。
一些具有泛型支持的语言(例如。( C++)在所有类型参数(或在C++的情况下,所有模板参数:在C++模板参数不限于类型)时,解决泛型方法的实现尽可能晚。
但是C#没有采用这种方法。这确实具有使编译模型更简单的优点,但它的功能不那么强大。
(就我个人而言,我希望能够显式专业化,包括部分专业化,但我也认识到,在.NET中解决类型的方式存在挑战。)
https://stackoverflow.com/questions/53483731
复制相似问题