我发现在void();三元运算符的“else”分支中被用作“什么都不做”,作为空指针检查的简写
Run Code Online (Sandbox Code Playgroud)if(var){ var->member(); }
作为
var ? var->member() : void();
但我似乎找不到对以void这种方式使用的关键字的任何引用,这是对void关键字本身的函数调用还是函子调用?或者它对 的类型没有任何影响void?或者这只是类似的 C++ 语法pass?
编辑:的返回类型member()就是void在这种情况下。
我正在尝试对 3d 坐标进行散列,以便为地图的索引创建唯一 ID
我的方法是目前
return hash(x + hash(y + hash(z)));
Run Code Online (Sandbox Code Playgroud)
或者在 C++ 中
struct ChunkHasher
{
std::size_t operator()(FLOAT3 const& vec) const
{
return std::hash<float>()(
vec.x + std::hash<float>()(
vec.y + std::hash<float>() (vec.z)
)
);
}
}chunkHasher;
Run Code Online (Sandbox Code Playgroud)
但问题是我得到的负载哈希冲突的...只是运行这个测试,都vec(0,0,0)和vec(-1,0,0)映射到对方
我觉得这应该可行,散列冲突应该只2.32831e-08%在我粗略计算的时候发生……我错过了什么吗?
编辑:在我的程序执行过程中,无论何时计算,给定的输入都应该散列到相同的输出中,因此不可能在每次调用时更改散列器的某种内部状态
我正在统一 C# 中编写一个通用函数(模板函数?),我遇到了这个问题。该函数是使用派生自的类型模板化运行的Component
T component = transform.gameObject.GetComponent<T>();
if(component != null)
{
objects.Add(component);
}
Run Code Online (Sandbox Code Playgroud)
我逐步完成了这个,它的值component是"null"(我期望的)但是然后程序继续并进入了if块......
在统一重载==/!=运算符以允许对其组件进行空检查(它们实际上永远不会为空 - 例如,component ??= foo不应该工作),但是当类型T为Component?
我最终设法让它与:
if(component as Component != null){...}
Run Code Online (Sandbox Code Playgroud)
但我的问题是,为什么这是必要的?c# 不检查传递给泛型函数的类型的运算符重载吗?传递的文字类型肯定会在运行时换入吗?