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

发布于 2024-10-15 23:21:16 字数 209 浏览 6 评论 0原文

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

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

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

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

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

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

And once I add +1 to byte it is not

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

溺ぐ爱和你が 2024-10-22 23:21:16

当您使用 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)

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)
苄①跕圉湢 2024-10-22 23:21:16

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

byte 的操作总是生成 int,因此 x+1int并且没有歧义 - 它必须选择 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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文