我在代表一个点的模板类中有以下 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>();
关于c# - 在 C# 中将泛型显式转换为另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54795017/