从泛型类型到泛型类型的隐式/显式强制转换运算符

本文关键字:泛型类型 转换 运算符 | 更新日期: 2023-09-27 18:28:07

我正在尝试将泛型类型强制转换为固定类型
以下是我所期望的工作,但其中有一个根本的缺陷

public class Wrapper<T>
{
    public T Value;
    static public implicit operator TypeWithInt(Wrapper<int> wrapper)
    {
        return new TypeWithInt(wrapper.Value);
    }
    static public implicit operator TypeWithFloat(Wrapper<float> wrapper)
    {
        return new TypeWithFloat(wrapper.Value);
    }
    static public implicit operator TypeWithDouble(Wrapper<double> wrapper)
    {
        return new TypeWithDouble(wrapper.Value);
    }
}

上面的代码没有编译,出现以下错误:

User-defined conversion must convert to or from the enclosing type

由于Wrapper<int>Wrapper<T>不同,它永远不会工作,因为Wrapper<int>不是封闭类型。

所以我的问题是:我该如何制作这个铸件?有办法吗

从泛型类型到泛型类型的隐式/显式强制转换运算符

您的对象模型有点荒谬,因为.NET类型系统一次最多只考虑两种类型:

/* type 1 (int) */ int a = "abc" /* type 2 (string) */;

然而,你试图迫使另一种类型处于中间,而这种类型并不啮合。这不是类型转换过程的限制,而是语言的限制。每个赋值(强制执行隐式类型转换的阶段)最多可以有两个活动方,左边(上例中为int)和右边(上例为string)。级联隐式强制转换不受支持,可能很难进行编码。

对于您的问题,我看到的唯一可能的解决方案是让您的用户更容易看到这种转换,并在Wrapper<T>上添加ToIntToFloat方法,使其能够完成自己的工作。

另一个关注点可能是这样做对性能的影响。。。所提出的包装器的最终结果是装箱操作,如果您使用的是公平负载,那么装箱操作可能会导致不理想的性能。另一种选择是重新安排您的应用程序,使其不那么特定于类型。这样做也可能消除你目前面临的问题。

您可以将强制转换添加到抽象的非泛型基类中,并使泛型类继承它。