如果我有一种方法:
public void SetPosition(Vector3 position){
// do stuff
}
我通过了Vector2,为什么它仍然允许它并自动将其转换为(x,y,0)?
有什么方法可以使方法更加严格和错误并且不自动转换向量?我有时会不知不觉地继续犯此错误,并且会得到一些错误,这些错误使我需要一段时间才能解决错误。
为什么在通过争论时C#甚至允许程序员能够做到这一点?
最佳答案
您无法解决此问题,因为您使用的库提供了转换。
Unity为here记录的定义了一个隐式转换运算符:
将Vector2
转换为Vector2
。
可以将Vector3
隐式转换为Vector2
(结果中的Vector3
设置为零)。
这与您的观察一致:对方法z
的调用分两步完成-首先,将Position
转换为Vector2
,且Vector3
设置为零,然后将结果传递给z
。
您可以使用一种技巧来击败转换运算符,但这会使您的代码可读性降低,因此我建议不要这样做。这个想法基于以下事实:C#不会应用两个隐式转换运算符来满足方法调用,因此您可以执行以下操作:
class Vector3Wrap {
private readonly Vector3 v;
private Vector3Wrap(Vector3 v) {
this.v = v;
}
public static implicit operator Vector3Wrap(Vector3 v) {
return new Vector3Wrap(v);
}
public static implicit operator Vector3(Vector3Wrap w) {
return w.v;
}
}
public void SetPosition(Vector3Wrap positionWrap){
Vector3 position = positionWrap;
// do stuff
}
现在,对
Position
的调用将成功,因为将隐式创建SetPosition(myVector3)
,但是调用Vector3Wrap
将失败,因为没有从SetPosition(myVector2)
到Vector2
的隐式转换。关于c# - 方法可以拒绝Vector2和Vector3的错误类型吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44014230/