如何返回一个在C#中隐式变窄和变宽的UInt

本文关键字:UInt 返回 何返回 一个 | 更新日期: 2023-09-27 18:26:45

在C#中,运算符会根据结果的大小隐式地缩小和扩大结果变量。

 UInt32 exampleA = 10000000/2;      // Will return a UInt32 
 UInt32 exampleB = 1000000000000/2; // Will implicitly widen to UInt64 and cause a compile error
 UInt64 exampleC = 1000000000000/2; // Will implicitly widen to UInt64 without error

你能为一种方法做到这一点吗?如果是,怎么做?我认为这与一般协方差有关;Contra方差,但不确定如何为以下的函数实现它

// Will compile but won't automatically widen
UInt32 validVariable= exampleFunction(1,1);
UInt32 invalidVariable = exampleFunction(UInt32.MaxValue,1);
private static UInt32 exampleFunction(UInt32 x, UInt32 y)
{
     return (x+y); //
}

// Won't compile but will automatically widen
UInt32 validVariable= exampleFunction(1,1); // Will cause compile error
UInt32 invalidVariable = exampleFunction(UInt32.MaxValue,1); // Will cause compile error
private static UInt64 exampleFunction(UInt32 x, UInt32 y)
{
     return (x+y); //
}

如何返回一个在C#中隐式变窄和变宽的UInt

这与泛型或方差无关。这并不是说运营商自己扩大或缩小了范围。允许编译器为输入和输出插入隐式转换。这两个编译器错误都是由于没有从ulonguint的内置转换。如果需要,编译器将插入从uintulong的隐式转换。观察到的除法运算符的行为是因为有两个重载可供编译器选择。您要做的等效操作是定义两个带有签名的重载:

uint exampleFunction(uint x, uint y)
ulong exampleFunction(ulong x, ulong y)

然后,如果其中一个参数恰好是更宽的ulong类型,编译器将选择第二个重载,因为它被允许插入从uintulong的转换。