繁体   English   中英

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

[英]Implicit/Explicit casting operator from/to generic type

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

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) */;

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

对于您的问题,我看到的唯一可能的解决方案是使此转换对您的用户更可见,并在Wrapper<T>上添加ToIntToFloat方法以使其完成工作。

另一个令人感兴趣的地方可能是这样做的性能影响...建议的包装程序的最终结果是装箱操作,如果您在中等负载下工作可能会导致不幸的性能。 替代方法是重新构造应用程序,使其不具有特定于类型的内容。 这样做还可以消除您当前面临的问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM