首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以接受c#中的一个参数的多个类型吗?

我可以接受c#中的一个参数的多个类型吗?
EN

Stack Overflow用户
提问于 2020-07-15 23:18:17
回答 2查看 675关注 0票数 2

我习惯打字,在那里我可以:

代码语言:javascript
复制
function test(param1: (string | number)) { }

我还可以创建一个类型并使用它:

代码语言:javascript
复制
type testType = (string | number)

function test(param1: testType) { }

c#有类似的不需要重载的东西吗?

-edit

我正在努力学习unity3d,我想要一个函数来回复声音的长度

我有两个数组,用于sfx和其他音乐。

轨道被映射到枚举,其值与数组中的跟踪索引相对应。

代码语言:javascript
复制
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,并返回数组中相应轨道的长度。

代码语言:javascript
复制
public float getPlaybackLength(...) {
    ...
    return ...[trackIndex].clip.length;
}

我不确定这是否可能,甚至不确定这是否是一个好方法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-15 23:46:15

在这里,您实际上问了两个不同的问题:如何让单个方法处理给定参数的不同类型,以及如何让单个变量存储不同的类型。

实际上,前者通常通过添加重载来解决;例如,声明test(string param1)test(int param1)。在某些情况下,一个单一的通用方法就足够了。这取决于如何在方法中实际使用参数。

至于后一个问题,这有点复杂,在很大程度上取决于希望一个变量能够存储不同类型的精确推理。在某些情况下,也可以在泛型上下文(类型或方法)中声明变量。

在其他情况下,您可以使用dynamic类型,这是一种机制,它将使用dynamic值的代码的编译推迟到运行时(出于明显的原因,这会使代码…慢得多)。它优化得很好,但仍然会增加很多开销)。

总之,对你问题的简短回答是:

c#有类似的不需要重载的东西吗?

…对于您认为需要此功能的原因,缺乏任何其他信息,即虽然重载实际上是首选,但泛型类型或方法可能满足您的需要。

以上应回答您在这里张贴的问题,如它是。这个问题太含糊,无法提供更具体的内容。如果你需要更多的具体信息,你应该张贴一个新的问题,考虑到你在这里收到的反馈,但详细说明了你想要解决的具体情况。

增编:

根据您经过编辑的问题,您似乎想要这样做:

代码语言:javascript
复制
public float getPlaybackLength(AudioSource[] tracks, FlexibleEnumType trackIndex) {
    return tracks[trackIndex].clip.length;
}

并传入Musics值或Sfx值。

有鉴于此,我建议采取以下备选办法:

代码语言:javascript
复制
public float getPlaybackLength(AudioSource track) {
    return track.clip.length;
}

你会这样称呼它:

代码语言:javascript
复制
Musics trackId = Musics.music1;

float length = getPlaybackLength(musics[(int)trackId]);

另一种选择是:

代码语言:javascript
复制
public float getPlaybackLength(AudioSource[] tracks, int trackIndex) {
    return tracks[trackIndex].clip.length;
}

被称为

代码语言:javascript
复制
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的东西,这基本上是相同的输入量。也许您有其他的场景,但是作为示例使用的方便方法似乎并没有增加那么多的方便。:)

票数 3
EN

Stack Overflow用户

发布于 2020-07-15 23:29:42

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62925122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档