假设我们有一个泛型类的想法Matrix
哪里T
是数字型(Complex
或double
或者float
,int
等).
很自然,我们在C#中从in float
到double
from double
进行了隐式转换Complex
.一般规则是我们有从较小类型到较大类型的隐式转换.到现在为止还挺好.
现在假设我们正在实现我们的Matrix
类型.由于这种新型的方式是数字也(或者至少其持有的数值),这是很自然有隐式转换从Matrix
到Matrix
,从Matrix
对Matrix
等至少它是好的,有这些像乘数学运算,加等但是这似乎无法正确实现,因为隐式运算符要求至少一个类型与我们实现它的类相同.
示例:下面的代码无法编译,甚至认为它可以解决我的问题.
public abstract partial class Matrix{ /// /// Implicitly converts a matrix to double precision complex numbers. /// public static implicit operator Matrix(Matrix matrix) { matrix.ToComplex(); } /// /// Implicitly converts a matrix to double precision real numbers. /// public static implicit operator Matrix(Matrix matrix) { matrix.ToDouble(); } }
它不会编译,因为"CS0556用户定义的转换必须转换为封闭类型或从封闭类型转换",让我说我很好,因为它是语言规范的一部分,但不应该有任何其他方法来实现这一点?
例如,这也不编译.
public abstract partial class Matrix{ /// /// Implicitly converts a matrix to single precision real numbers. /// public static implicit operator Matrix(Matrix matrix) { matrix.ToDouble(); } }
有没有办法实现这个目标,感觉很自然,所以我觉得它应该是可以实现的?
目前我已经创建了一种解决方法,可以将所有类型的隐式转换转换为最大类型,但不能解析转换Matrix
为转换Matrix
,它只会将转换解析为Matrix
.
public abstract partial class Matrix{ /// /// Implicitly converts a matrix to double precision complex numbers. /// public static implicit operator Matrix(Matrix matrix) { return matrix.Map(x => { if (x is Numerics.Complex32) { var xc32 = (Numerics.Complex32)(object)x; return new Complex64(xc32.Real, xc32.Imaginary); } return new Complex64(Convert.ToDouble(x), 0); }, Zeros.AllowSkip); } }
如果有人对这个问题的背景感兴趣,你可以看看 https://github.com/mathnet/mathnet-numerics/issues/304
解决这个问题的另一个选择可能是使用"扩展运算符"(类似于扩展方法),但C#中不存在这些选项.