如何返回在C#中隐式缩小和扩大的UInt?

时间:2015-12-15 06:33:10

标签: c# implicit-conversion

在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

你可以这样做一个方法,如果是这样的话?我相信它与Generic Covariance&对比差异但不确定如何为下面的函数实现它

// 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); //
}

1 个答案:

答案 0 :(得分:3)

这与泛型或差异无关。并不是运营商自己扩大或缩小。允许编译器为输入和输出插入隐式转换。这两个编译器错误都是由于没有从ulonguint的内置转换这一事实引起的。如果需要,编译器将插入从uintulong的隐式转换。观察到除法运算符的行为是因为有两个重载可供编译器选择。您要做的同样的事情是使用签名定义两个重载:

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

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