根据编译器,我不明白为什么以下内容不明确:
byte x = 200;
int novaCervena = Math.Min(x, 10);
一旦我将 +1 添加到 byte 它就不是
byte x = 200;
int novaCervena = Math.Min(x+1, 10);
根据编译器,我不明白为什么以下内容不明确:
byte x = 200;
int novaCervena = Math.Min(x, 10);
一旦我将 +1 添加到 byte 它就不是
byte x = 200;
int novaCervena = Math.Min(x+1, 10);
x+1
当您用作第一个参数的类型时,它绝对不是模棱两可的 then int
。byte+byte
( C# 中没有运算符。)
在第一种情况下,您有一个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)
我假设在第一种情况下它不能在 and 之间进行Min(byte,byte)
选择Min(int,int)
。
上的操作byte
总是会产生一个int
,所以x+1
是int
并且没有歧义——它必须选择Min(int,int)
。