当前位置: 首页 > 编程语言 > C#

我可以向我不直接控制的两个类添加隐式转换吗?分享

时间:2023-04-11 01:56:18 C#

我可以为我不直接控制的两个类添加隐式转换吗?我希望能够在两个不兼容的类之间进行隐式转换。其中一个类是Microsoft.Xna.Framework.Vector3,另一个只是F#项目中使用的Vector类。我正在使用XNA在C#中编写一个3D游戏,并且-尽管它是在3D中绘制的,但该游戏仅在二维中进行(它是鸟瞰图)。使用2D向量处理物理的F#类:键入VectorSuperUnit>=|'t*'t的笛卡尔|'t*float成员的极坐标this.magnitude=将其与|匹配笛卡尔(x,y)->x.newValue(sqrt(x.units**2.0+y.units**2.0))|Polar(m,_)->m.newValue(m.units)成员this.direction=将其与|匹配笛卡尔(x,y)->tan(y.units/x.units)|Polar(_,d)->d成员this.x=将this与|匹配笛卡尔(x,_)->x|极坐标(m,d)->m。newValue(m.units*cos(d))memberthis.y=将此与|匹配笛卡尔(_,y)->y|Polar(m,d)->m.newValue(m.units*sin(d))此向量类使用物理项目使用的单位系统,它采用原生F#测量单位并将它们组合在一起(距离、时间的单位、质量等)。但是XNA使用它自己的Vector3类。我想添加一个从F#Vector到XNAVector3的隐式转换,它处理Vector3游戏中发生的二维,哪个轴是“向上”等。很简单,只需Vectorv->newVector3(vx,vy,0)或其他任何东西。我不知道该怎么办。我不能在F#中添加隐式转换,因为类型系统(正确地)不允许这样做。我无法将它添加到Vector3类中,因为它是XNA库的一部分。据我所知,我不能使用扩展方法:vv){returnnewVector3((float)vxunits,(float)vyunits,0);}publicstaticvoidtest(){varv=Vector.NewCartesian(Distance.Meters(0),Distance.Meters(0));向量3一个;一=v;}}对于a=v是错误的;一=v;(不能隐式转换...)。有没有办法在不将演员表放在任何一个班级的情况下做到这一点?作为最后的手段,我可??以打开Microsoft.Xna.Framework并在F#中转换它,但这对我来说似乎不正确——物理库不应该知道或关心我用来编写游戏的框架。你不能。隐式运算符必须定义为其中一个类的成员。但是,您可以定义扩展方法(您的示例不起作用,因为扩展方法必须在公共静态类中)。publicstaticclassConverterExtensions{publicstaticVectorToVector(thisVector3input){//convert}}在C#中你不能。您可以提供具有额外转换的后代类型(假设该类型未密封);或者您可以提供一个以某种方式添加转换的通用包装类。所有这一切的便利性取决于如何将这些包装器/改编与原始API一起使用。另一方面,我看到您也在使用F#。IIRCF#应该具有某种程度的元编程能力(就像许多用于.NET的函数式语言,如Boo和Nemerle)。如果它可以在这里使用,我不会感到惊讶。不幸的是,我的F不够好,无法提供帮助以上是C#学习教程:我可以为两个我不直接控制的类添加隐式转换吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: