我习惯打字,在那里我可以:
function test(param1: (string | number)) { }我还可以创建一个类型并使用它:
type testType = (string | number)
function test(param1: testType) { }c#有类似的不需要重载的东西吗?
-edit
我正在努力学习unity3d,我想要一个函数来回复声音的长度
我有两个数组,用于sfx和其他音乐。
轨道被映射到枚举,其值与数组中的跟踪索引相对应。
public AudioSource[] musics;
public AudioSource[] sfx;
public enum Musics {
music1, // names are just exemples
music2,
music3
}
public enum Sfx {
sfx1,
sfx2,
sfx3
}我想编写一个函数,它可以同时接受Musics.music1和Sfx.sfx1,并返回数组中相应轨道的长度。
public float getPlaybackLength(...) {
...
return ...[trackIndex].clip.length;
}我不确定这是否可能,甚至不确定这是否是一个好方法
发布于 2020-07-15 23:46:15
在这里,您实际上问了两个不同的问题:如何让单个方法处理给定参数的不同类型,以及如何让单个变量存储不同的类型。
实际上,前者通常通过添加重载来解决;例如,声明test(string param1)和test(int param1)。在某些情况下,一个单一的通用方法就足够了。这取决于如何在方法中实际使用参数。
至于后一个问题,这有点复杂,在很大程度上取决于希望一个变量能够存储不同类型的精确推理。在某些情况下,也可以在泛型上下文(类型或方法)中声明变量。
在其他情况下,您可以使用dynamic类型,这是一种机制,它将使用dynamic值的代码的编译推迟到运行时(出于明显的原因,这会使代码…慢得多)。它优化得很好,但仍然会增加很多开销)。
总之,对你问题的简短回答是:
c#有类似的不需要重载的东西吗?
…对于您认为需要此功能的原因,缺乏任何其他信息,即虽然重载实际上是首选,但泛型类型或方法可能满足您的需要。
以上应回答您在这里张贴的问题,如它是。这个问题太含糊,无法提供更具体的内容。如果你需要更多的具体信息,你应该张贴一个新的问题,考虑到你在这里收到的反馈,但详细说明了你想要解决的具体情况。
增编:
根据您经过编辑的问题,您似乎想要这样做:
public float getPlaybackLength(AudioSource[] tracks, FlexibleEnumType trackIndex) {
return tracks[trackIndex].clip.length;
}并传入Musics值或Sfx值。
有鉴于此,我建议采取以下备选办法:
public float getPlaybackLength(AudioSource track) {
return track.clip.length;
}你会这样称呼它:
Musics trackId = Musics.music1;
float length = getPlaybackLength(musics[(int)trackId]);另一种选择是:
public float getPlaybackLength(AudioSource[] tracks, int trackIndex) {
return tracks[trackIndex].clip.length;
}被称为
Musics trackId = Musics.music1;
float length = getPlaybackLength(musics, (int)trackId);请注意,即使您为该参数编写了一个采用任一enum类型的方法(并且可以使用泛型),仍然需要将enum值转换为int,以便对数组进行索引。因此,为了简单起见,您最好在传递值之前进行转换。
正如我前面提到的,您可以编写一个可以接受任一enum类型的泛型方法,但是您不能将它限制为这两种enum类型,而且方法主体中从enum值到int的转换有点尴尬,因为您将无法直接从类型参数类型进行转换。它需要先转换为object,这会导致装箱和取消装箱转换,从而完成转换。
如果您真的想要一种100%类型安全的方法,包括传递enum值,而不是转换为调用的int,那么您应该继续编写几个重载来实现这个目的。
最后一个想法是:也许您的AudioSource类型本身可以提供一个返回clip.length属性值的方便属性。如果这不是您自己的类型,您可以编写一个用户定义的类型来包装该类型的对象,并提供方便的属性本身。这样,您就可以直接从已经拥有的对象中获取值,而不必一直在数组中查找对象。
顺便说一句,您当然也可以使用AudioSource对象,尽管使用的是属性路径clip.length…。坦白说,这对我来说并没有那么糟糕。毕竟,一个方便的属性可能被称为类似于ClipLength的东西,这基本上是相同的输入量。也许您有其他的场景,但是作为示例使用的方便方法似乎并没有增加那么多的方便。:)
发布于 2020-07-15 23:29:42
void PrintName(object name)
{
// if you want to do something type specific u need to cast the object
// in this specific method there is no need for casting to a specific type
Console.WriteLine(name);
}https://stackoverflow.com/questions/62925122
复制相似问题