当前位置:  开发笔记 > 编程语言 > 正文

泛型类的隐式转换仅限于某些类型

如何解决《泛型类的隐式转换仅限于某些类型》经验,为你挑选了0个好方法。

假设我们有一个泛型类的想法Matrix哪里T是数字型(Complexdouble或者float,int等).

很自然,我们在C#中从in floatdoublefrom double进行了隐式转换Complex.一般规则是我们有从较小类型到较大类型的隐式转换.到现在为止还挺好.

现在假设我们正在实现我们的Matrix类型.由于这种新型的方式是数字也(或者至少其持有的数值),这是很自然有隐式转换从MatrixMatrix,从MatrixMatrix等至少它是好的,有这些像乘数学运算,加等但是这似乎无法正确实现,因为隐式运算符要求至少一个类型与我们实现它的类相同.

示例:下面的代码无法编译,甚至认为它可以解决我的问题.

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#中不存在这些选项.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有