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

时间:2013-08-18 02:08:35

标签: c# casting

我正在尝试将通用类型转换为固定类型 以下是我期望的工作,但其中存在一个根本性的缺陷。

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>不是封闭类型。

所以我的问题是:如何让这个演员工作?有办法吗?

2 个答案:

答案 0 :(得分:3)

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

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

然而,你试图在中间强制另一种不啮合的类型。这不是类型转换过程的限制,而是语言的限制。每个分配(强制执行隐式类型转换的阶段)最多可以包含2个活动方,左侧(上例中的int)和右侧(上例中的string)。不支持级联隐式强制转换,并且可能很难编写代码。

我看到您问题的唯一可行解决方案是让您的用户更容易看到此转换,并在ToInt上添加ToFloatWrapper<T>方法以允许其完成工作

另一个兴趣点可能是这样做的性能影响...你提议的包装器的最终结果是装箱操作,如果你正在使用公平的负载,可能会导致不幸的性能。另一种方法是将您的应用程序重新架构为更少类型特定。这样做可能也会消除您目前面临的问题。

答案 1 :(得分:0)

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