在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); //
}
答案 0 :(得分:3)
这与泛型或差异无关。并不是运营商自己扩大或缩小。允许编译器为输入和输出插入隐式转换。这两个编译器错误都是由于没有从ulong
到uint
的内置转换这一事实引起的。如果需要,编译器将插入从uint
到ulong
的隐式转换。观察到除法运算符的行为是因为有两个重载可供编译器选择。您要做的同样的事情是使用签名定义两个重载:
uint exampleFunction(uint x, uint y)
ulong exampleFunction(ulong x, ulong y)
然后,如果其中一个参数恰好是更广泛的ulong
类型,编译器将选择第二个重载,因为它允许插入从uint
到ulong
的转换。