0

我正在尝试将泛型类型转换为固定类型。
以下是我期望的工作,但它有一个根本性的缺陷。

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

As Wrapper<int>is different from Wrapper<T>it'll never work,因为Wrapper<int>它不是封闭类型。

所以我的问题是:我怎样才能使这个铸造工作?有办法吗?

4

2 回答 2

3

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

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

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

对于您的问题,我看到的唯一可能的解决方案是让这种转换对您的用户更加可见,并添加ToInt,ToFloat方法Wrapper<T>以允许它完成其工作。

另一个有趣的地方可能是这样做对性能的影响......您提出的包装器的最终结果是一个装箱操作,如果您正在处理一个公平的负载,这可能会导致不幸的性能。另一种方法是重新架构您的应用程序以减少类型特定。这样做也可能会消除您当前面临的问题。

于 2013-08-18T02:19:10.400 回答
0

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

于 2013-08-18T02:12:45.530 回答