C# 非零函数参数在函数中变为零
我正在使用64位Ubuntu 18.04开发一个C#/Unity项目。我有两个非静态类,C# 非零函数参数在函数中变为零,c#,unity3d,C#,Unity3d,我正在使用64位Ubuntu 18.04开发一个C#/Unity项目。我有两个非静态类,ClassA和ClassB,在实例方法ClassA.Foo()中,有两个对public static int方法ClassB.float(float x)的调用。在Foo调用Floor的两个地方之一,如果我跟踪从classA.Foo传递到ClassB.Floor的值的堆栈跟踪,则Foo的非零输入在Floor内部在任何计算发生之前变为0 我在stackoverflow、stackexchange和google上
ClassA
和ClassB
,在实例方法ClassA.Foo()
中,有两个对public static int
方法ClassB.float(float x)
的调用。在Foo
调用Floor
的两个地方之一,如果我跟踪从classA.Foo
传递到ClassB.Floor
的值的堆栈跟踪,则Foo
的非零输入在Floor
内部在任何计算发生之前变为0
我在stackoverflow、stackexchange和google上搜索过一些人,他们在将变量从非零变为0的过程中遇到了问题,无论是在C#还是其他语言中。我发现了一些关于传递引用和值类型的结果,但是ClassB.Floor
正在接收一个浮点并返回一个int。我已经确认了正确类型的值(非双浮点)正在输入到ClassB.Floor
ClassB.地板
定义为
公共类B类:单一行为{
[...]
公共静态内部楼层(浮动x){
席X=(int)x;
返回X<席?席1:席;
}
}
带有调试器值注释的示例:
公共类ClassA{
#在初始化过程中设置其他位置,但必须
#在调用'Foo'时已存在。
私有游戏对象游戏对象;
[...]
公共字节Foo(vector3pos){#pos:(-17f,0f,15f)
[...]
int x=B类地板(位置x)#x:-17
Vector3 objPosition=gameObject.transform.position;#objPosition:(-16f,0f,0f)
浮点xx=objPosition.x;#xx:-16f
int px=B类地板(xx)#px:0
[...]
}
}
因此,ClassB.Floor
没有正确设置px
值,即使它在计算x
时工作正常。此外,如果我进入调试器并遵循intpx=ClassB.Floor(xx)的程序流
在classA.Foo
进入ClassB.Floor
时,我立即看到:
publicstaticintfloor(floatx){#x:0
如果我在定义xx
后的程序执行过程中的任何时候使用Rider的调试器的求值表达式功能,ClassB.Floor(xx)
返回正确的-16
值,即使程序本身没有
在程序通过这部分代码的过程中,不会产生任何错误或警告。有人知道是什么导致了这种情况吗?我真的很困惑。提前谢谢
[更新]这里有一个更简单的例子来演示相同的行为。ClassB.Floor
似乎一点也不重要:
公共类ClassA{
公共字节Foo(vector3pos){#pos:(-17f,0f,15f)
浮点数xx=-16f;#xx:-16f
int px=Mathf.FloorToInt(xx);#px:0
返回0;
}
}
相同的交易:如果我进入Mathf.FloorToInt,定义为
public static int FloorToInt(浮点f)
{
返回(整数)数学层((双)f);
}
我发现从函数一开始就
f=0
,即使xx=-16f
这对我来说非常好:
public class ClassB : MonoBehaviour
{
void Start(){
ClassA instance = new ClassA(gameObject);
instance.Foo(new Vector3(10.5f,15.2f,20.8f));
}
public static int Floor(float x) // 10.5f and 12.19f
{
int xi = (int)x;
return x < xi ? xi - 1 : xi;
}
}
public class ClassA
{
private GameObject gameObject;
public ClassA(GameObject go){
gameObject = go;
}
public byte Foo(Vector3 pos) // new Vector3(10.5f,15.2f,20.8f)
{
int x = ClassB.Floor(pos.x); // 10
//Debug.Log(x);
Vector3 objPosition = gameObject.transform.position; // new Vector3(12.19f, 1f, -10f);
float xx = objPosition.x; // 12.19f
int px = ClassB.Floor(xx); //12
//Debug.Log(px);
return new byte();
}
}
公共类B类:单一行为
{
void Start(){
ClassA实例=新ClassA(游戏对象);
Foo(新矢量3(10.5f,15.2f,20.8f));
}
公共静态内部楼层(浮动x)//10.5f和12.19f
{
席X=(int)x;
返回X<席?席1:席;
}
}
甲级公共课
{
私有游戏对象游戏对象;
公共类A(游戏对象go){
gameObject=go;
}
公共字节Foo(vector3pos)//新的Vector3(10.5f、15.2f、20.8f)
{
int x=B类地板(位置x);//10
//Debug.Log(x);
Vector3 objPosition=gameObject.transform.position;//新的Vector3(12.19f,1f,-10f);
float xx=objPosition.x;//12.19f
int px=ClassB.Floor(xx);//12
//调试日志(px);
返回新字节();
}
}
对我来说,你所经历的很奇怪。你的地板功能不依赖于任何状态,并且在本地测试时工作良好。我唯一关心的是gameObject.transform.position
,因为尽管它似乎填充了正确的值,但唯一的可能是linefloat xx
不包含正确的值或它的值在执行隐式转换时丢失,但这似乎是不可能的,因为Vector3的X成员也是一个浮点数…@AlbertoSolano同意。我通过插入Debug.Log(xx是float+“”+xx是double)确认它工作正常
在创建xx
之后,按照预期得到了True-False
。因此,不管怎样,xx
在作为参数传递到ClassB.Floor
之前,似乎是一个正常的浮点。我可能还应该注意到-当ClassB.Floor
被Mathf.Floo>替换时,我得到了相同的行为rToInt
,所以问题可能根本不在于ClassB
。是的,事实上我可以移除Vector3
游戏对象位置,将xx
设置为一些浮点文字,比如16f
,然后使用Mathf.FloorToInt
而不是我的自定义Floor
,我得到了同样的结果。我真的很困惑这是怎么回事可能会发生。不过感谢您尝试了一个完整的示例!我担心这是一些可怕的系统错误。@heyitsguay在编写此代码时,我实际上复制了ClassB.Floor(pos.x)
不写两次,放在int px
之后。但是,我忘了把pos.x
改成xx
,我得到的东西和你得到的一样。也许你在实际的cod中读错了什么