如果我有一种方法:

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/

10-13 03:14