我刚刚发现了这个有趣的问题:
int done = 50;
int? total = 100;
var perc = done * 100 / total; // No problem
// Error: Argument 2: cannot convert from 'int?' to 'byte'
// Argument 1 is still int32
var perc2 = Math.Min(100, done * 100 / total);
起初,我的代码只需要第一个perc
。令人惊讶的是,那里没有错误,因为我错过了应该在那里的null
检查。直到后来我才发现了我的错误:
然后有一些情况下,估计值total
比应该的要小,但百分比需要被限制在100,所以我添加了Math.Min
。现在我发现我错过了一个空值检查,而且错误信息有点误导人。
这里发生了什么?在这种情况下,C#试图做什么?
int, int?
的Min
重载操作,因此您需要使用 C# 中重载方法的复杂规则来获取“最佳匹配”。毫无疑问,通过仔细解析标准,可以清楚地了解为什么第一个参数被解析为byte
而不是其他任何整数类型,但这是标准中最困难的部分,所以我相信编译器在那里做正确的事情。 - Jeroen Mostertperc
的类型是int?
,所以没问题。但传递给Math.Min()
的值必须是int
,而不是int?
,所以这样行不通。 - Matthew Watsonperc
也是一个int?
(即Nullable<int>
,这是完全不同的int
类型)。 - Luke Voint?
,它可以根据需要进行解析。奇怪的是,如果我将光标悬停在第一个参数上,它会显示为int32
,但它却选择了第一个重载(即byte,byte
)。 - Luke Vo