是什么让Min(byte,int)调用模糊不清?

时间:2011-02-07 07:19:57

标签: c# byte ambiguous-call

根据编译器,我不明白为什么以下是不明确的:

byte x = 200; 
int novaCervena = Math.Min(x, 10);

一旦我向字节添加+1,它就不是

byte x = 200; 
int novaCervena = Math.Min(x+1, 10);

2 个答案:

答案 0 :(得分:11)

使用x+1时绝对不会模糊,因为第一个参数的类型是int。 (C#中没有byte+byte运算符。)

在第一种情况下,您有一个byte参数,可以隐式转换为int,然后是整数文字参数。参数类型为int,但隐式常量表达式转换为byte(参见第6.1.9节)。因此,虽然Min(byte, byte)Min(int, int)都适用于重载,但每个参数都是“首选”(由于转换可用),因此存在歧义。

请注意,如果您有一个类型为int的“正常”表达式(而不是常量表达式),则歧义消失:

byte x = 200;
int y = 10;
int z = Math.Min(x, y); // Uses Math.Min(int, int)

同样是一个普通的byte参数:

byte x = 200;
byte y = 10;
byte z = Math.Min(x, y); // Uses Math.Min(byte, byte)

或者你可以强制转换:

byte x = 200;
byte z = Math.Min(x, (byte)10); // Uses Math.Min(byte, byte)

byte a = 200;
int b = Math.Min((int) a, 10); // Uses Math.Min(int, int)

答案 1 :(得分:4)

我假设在第一种情况下,它无法在Min(byte,byte)Min(int,int)之间进行选择。

byte 上的操作始终会产生int,因此x+1int并且没有歧义 - 它必须选择{ {1}}。