What makes a Min(byte,int) call ambiguous?

loj*_*jol 4 c# byte ambiguous-call

I do not understand why the following is ambiguous according to compiler:

byte x = 200; 
int novaCervena = Math.Min(x, 10);
Run Code Online (Sandbox Code Playgroud)

And once I add +1 to byte it is not

byte x = 200; 
int novaCervena = Math.Min(x+1, 10);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

当你使用x+1第一个参数的类型时,它绝对不是模棱两可的int.(byte+byteC#中没有运算符.)

在第一种情况下,您有一个byte参数可以隐式转换为a 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)
Run Code Online (Sandbox Code Playgroud)

同样是正常的byte论点:

byte x = 200;
byte y = 10;
byte z = Math.Min(x, y); // Uses Math.Min(byte, byte)
Run Code Online (Sandbox Code Playgroud)

或者你可以强制转换:

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)
Run Code Online (Sandbox Code Playgroud)