开发者

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

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

byte x = 200; 
int novaCervena 开发者_StackOverflow中文版= Math.Min(x, 10);

And once I add +1 to byte it is not

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


It's definitely not ambiguous when you use x+1 as the type of the first argument is then int. (There's no byte+byte operator in C#.)

In the first case, you have a byte argument which can be implicitly converted to an int, but then an integer literal argument. The argument is of type int, but with an implicit constant expression conversion to byte (see section 6.1.9). So while both Min(byte, byte) and Min(int, int) are applicable overloads, each is "preferred" for a different parameter (due to the conversions available), hence the ambiguity.

Note that if you have a "normal" expression of type int (as opposed to a constant expression) the ambiguity goes away:

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

Likewise a normal byte argument:

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

Or you can force the conversion either way:

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)


I assume in the first case it can't choose between Min(byte,byte) and Min(int,int).

Operations on byte always result in an int, so x+1 is int and there is no ambiguity - it has to choose Min(int,int).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜