c# - 在 C# 中将泛型显式转换为另一种类型

标签 c# generics casting explicit

我在代表一个点的模板类中有以下 C++ 代码。我想将它翻译成 C#:

template <class T>
class Point
{
    public:
        T x;
        T y;
        T z;

    template<typename U> explicit Point(const Point<U> &p)
       : x((T)p.x), y((T)p.y), z((T)p.z)
    {
    }
}

此代码使给定类型的点能够显式转换为另一种类型的点。例如,您可以像这样使用它(诚然,我不是 100% 确定这里的语法,但我明白了这个概念):

Point<float> p;
Point<int> q = (Point<int>)p;

如何在 C# 中启用与此等效的功能?到目前为止,我有:

public class Point<T>
{
    public T X { get; set; }
    public T Y { get; set; }
    public T Z { get; set; }

    // Constructors exist that accept X, Y, and Z as parameters

    public static explicit operator Point<U>(Point<T> p)
    {

    }
}

然而,这给出了一个错误,说“U”是未定义的。这是有道理的......但是我如何/在哪里定义你?我的方法不对吗?

我的问题和那个问题的区别here是我只是通过强制转换更改泛型类的底层类型...而不是试图将一个泛型类更改为具有相同底层类型的不同泛型类。

最佳答案

我认为你能得到的最好的是:

public class Point<T>
{
    public T X { get; set; }
    public T Y { get; set; }
    public T Z { get; set; }

    public Point<U> As<U>()
    {
        return new Point<U>()
        {
            X = Convert<U>(X),
            Y = Convert<U>(Y),
            Z = Convert<U>(Z)
        };
    }

    static U Convert<U>(T t) => (U)System.Convert.ChangeType(t, typeof(U));
}

您不能定义通用转换运算符,因此您需要它是一个显式函数。此外,简单的转换 (U)t 将不起作用,因此您需要 Convert.ChangeType(如果您的类型是数字,它将起作用)。

用法:

var p1 = new Point<int> { X = 1, Y = 2, Z = 3 };
var p2 = p1.As<double>();

(works as expected)。

关于c# - 在 C# 中将泛型显式转换为另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54795017/

相关文章:

c# - 当我在测试中设置 IMediator Mock 时返回 null

c# - Unity3d错​​误CS0103 : The name `PeerState' does not exist in the current context

c# - 控制风扇速度

c# - 将 "dynamic"关键字与 __ComObject 一起使用时 RuntimeBinder 中的泄漏

Swift 泛型引用类型

windows - 从 C++/Cx 中的框架对象转换为模板化类

generics - 传递 map 功能时类型推断不起作用

swift - 如何使用泛型类型获取相同类型的对象

Java - 转换 Set 的缺点?

c# - c#中的类转换