从泛型类型到泛型类型的隐式/显式强制转换运算符
本文关键字:泛型类型 转换 运算符 | 更新日期: 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>
上添加ToInt
、ToFloat
方法,使其能够完成自己的工作。
另一个关注点可能是这样做对性能的影响。。。所提出的包装器的最终结果是装箱操作,如果您使用的是公平负载,那么装箱操作可能会导致不理想的性能。另一种选择是重新安排您的应用程序,使其不那么特定于类型。这样做也可能消除你目前面临的问题。
您可以将强制转换添加到抽象的非泛型基类中,并使泛型类继承它。