Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么使得Min(byte,int)调用不明确?_C#_Byte_Ambiguous Call - Fatal编程技术网

C# 什么使得Min(byte,int)调用不明确?

C# 什么使得Min(byte,int)调用不明确?,c#,byte,ambiguous-call,C#,Byte,Ambiguous Call,我不理解为什么编译器认为以下内容不明确: byte x = 200; int novaCervena = Math.Min(x, 10); 一旦我给字节加上+1,它就不是了 byte x = 200; int novaCervena = Math.Min(x+1, 10); 当您使用x+1作为第一个参数的类型是int时,它肯定不会有歧义。(C#中没有byte+byte运算符。) 在第一种情况下,您有一个byte参数,它可以隐式转换为int,但随后是一个整数文本参数。该参数的类型为int,

我不理解为什么编译器认为以下内容不明确:

byte x = 200; 
int novaCervena = Math.Min(x, 10);
一旦我给字节加上+1,它就不是了

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

当您使用
x+1
作为第一个参数的类型是
int
时,它肯定不会有歧义。(C#中没有
byte+byte
运算符。)

在第一种情况下,您有一个
byte
参数,它可以隐式转换为
int
,但随后是一个整数文本参数。该参数的类型为
int
,但具有到
字节的隐式常量表达式转换(参见第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 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)

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


byte
的操作总是导致
int
,因此
x+1
int
,没有歧义-它必须选择
Min(int,int)

谢谢,我知道了。所以我需要投int@lojol:如果您想让它使用
int
版本,可以。@lojol:您可以有一个表达式
byte+byte
,只是没有为它明确定义运算符。在这种情况下,编译器会将两个操作数提升为
int
,以便可以使用
int+int
运算符。所以你可以写这样一个表达式,只是没有直接的操作符。对你来说,理解这种区别是很重要的。