首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于可拓方法的模板专门化

基于可拓方法的模板专门化
EN

Stack Overflow用户
提问于 2018-11-26 14:53:19
回答 2查看 768关注 0票数 2

在C#中,我希望有一个泛型类的不同行为方式的方法,使用类似于显式模板专业化的东西

我从相关员额中看到,使用扩展在C#中可能会出现这样的情况,但我的代码并没有达到预期的效果:我希望Thing<int>::Method()有一种行为,当<T>不是<int>时,需要另一种行为。

我有过

代码语言:javascript
运行
复制
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();
    }
}

但是这个输出

代码语言:javascript
运行
复制
Thing<T> specialization
Thing<T> specialization
Thing<T> specialization
Thing<int> specialization

而不是

代码语言:javascript
运行
复制
Thing<T> specialization
Thing<T> specialization
Thing<int> specialization
Thing<int> specialization

显而易见的问题是“为什么不直接调用Specialization<T>而不是Method呢?”希望我包含了接口类--我正在努力适应它的框架。

我可以看出Specialization<T>Specialization<int>是匹配的,但我很惊讶后者没有被认为是更好的匹配!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-26 15:00:11

不幸的是,当您调用Method()时,它正在以Thing<T>的形式运行,而不知道它是Thing<int>。您可以使用反射来找出这一点,或者(更好的主意):

代码语言:javascript
运行
复制
if(this instanceof Thing<int> x)
  x.Specialisation();
else
  this.Specialisation();

或者,您可以声明Method()virtual,并使用override void Method(){...}创建IntThing : Thing<int>

票数 2
EN

Stack Overflow用户

发布于 2018-11-26 15:03:15

编译包含方法时解析对this.Specialization<T>();的调用。在这一点上,T是任何东西。

一些具有泛型支持的语言(例如。( C++)在所有类型参数(或在C++的情况下,所有模板参数:在C++模板参数不限于类型)时,解决泛型方法的实现尽可能晚。

但是C#没有采用这种方法。这确实具有使编译模型更简单的优点,但它的功能不那么强大。

(就我个人而言,我希望能够显式专业化,包括部分专业化,但我也认识到,在.NET中解决类型的方式存在挑战。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53483731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档