我正在尝试将通用类型转换为固定类型 以下是我期望的工作,但其中存在一个根本性的缺陷。
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>
不是封闭类型。
所以我的问题是:如何让这个演员工作?有办法吗?
答案 0 :(得分:3)
您的对象模型有点荒谬,因为.NET类型系统一次最多只考虑两种类型:
/* type 1 (int) */ int a = "abc" /* type 2 (string) */;
然而,你试图在中间强制另一种不啮合的类型。这不是类型转换过程的限制,而是语言的限制。每个分配(强制执行隐式类型转换的阶段)最多可以包含2个活动方,左侧(上例中的int
)和右侧(上例中的string
)。不支持级联隐式强制转换,并且可能很难编写代码。
我看到您问题的唯一可行解决方案是让您的用户更容易看到此转换,并在ToInt
上添加ToFloat
,Wrapper<T>
方法以允许其完成工作
另一个兴趣点可能是这样做的性能影响...你提议的包装器的最终结果是装箱操作,如果你正在使用公平的负载,可能会导致不幸的性能。另一种方法是将您的应用程序重新架构为更少类型特定。这样做可能也会消除您目前面临的问题。
答案 1 :(得分:0)
您可以将强制转换添加到抽象的非泛型基类中,并使泛型类继承它。