调用Math.Ceiling(word.Length/2)出现调用歧义错误的技术问询
解决Math.Ceiling调用的重载歧义问题
嘿,这个问题我刚接触C#的时候也踩过坑,咱们来把它说透~
为什么会出现歧义?
首先得搞清楚几个关键点:
word.Length是int类型,当你执行word.Length / 2时,两个int做除法,结果还是int(比如长度5的话,5/2=2,不是2.5).NET的Math.Ceiling方法没有接收int参数的重载,只有两个版本:Math.Ceiling(decimal)和Math.Ceiling(double)- 编译器看到你传了一个int,它可以自动把int转成decimal或者double,但它没法判断你想选哪一个,所以就抛出了「重载歧义」的错误
怎么解决?
有两种简单的方式,本质都是让编译器明确知道要调用哪个重载:
1. 显式将运算数转为double/decimal
把word.Length或者运算结果显式转成目标类型,比如:
// 转成double(最常用的方式) int mid = (int)Math.Ceiling((double)word.Length / 2); // 或者转成decimal,效果一样 int mid = (int)Math.Ceiling((decimal)word.Length / 2);
2. 用浮点字面量触发自动转换
把除数2改成2.0(double类型的字面量),这样word.Length会被自动转成double,除法结果也是double,直接匹配对应的重载:
int mid = (int)Math.Ceiling(word.Length / 2.0);
额外提醒
如果你是想获取单词的中间字符索引,要注意C#的字符串索引是从0开始的。比如长度为5的单词,Ceiling(5/2.0)得到3,对应的索引是2(3-1)才是中间字符的位置,根据你的实际需求调整就行~
内容的提问来源于stack exchange,提问作者phunder
相关产品推荐
相关产品推荐

