在C#Tuple中使用Int64

fin*_*ook 1 c# generics tuples

我确信这很简单,但是在使用.Create()Tuple类的方法时我遇到了编译器错误.

Dictionary<long, Tuple<long, long>> test = new Dictionary<long, Tuple<long, long>>();
test.Add(1, Tuple.Create(1, 2)); // <-- compiler error
Run Code Online (Sandbox Code Playgroud)

错误是Tuple.Create具有无效参数,因为它期望长,并且我放入的数字被视为整数.

在这种情况下,是的,它们在int的范围内,但它们有时可能具有对于int而言太大的值.

我可以强制(long)1转换代码来编译,但这似乎不对 - 我错过了什么?

Chr*_*ian 10

使用L后缀指定您希望您的数字类型为long:

test.Add(1, Tuple.Create(1L, 2L));
Run Code Online (Sandbox Code Playgroud)

如果没有后缀,.NET会假定这些数字为ints,从而创建Tuple<int, int>实例而不是所需的实例Tuple<long, long>.


cuo*_*gle 8

您的代码是等效的:

Tuple<long, long> yourTuple = Tuple.Create(1, 1);
Run Code Online (Sandbox Code Playgroud)

但是,因为1可以是int或者long,所以默认情况下,编译器会Tuple<int, int>在调用时返回:

 Tuple.Create(1, 1)  
Run Code Online (Sandbox Code Playgroud)

这就是你得到编译器错误的原因.因此,您需要使用通用版本明确进行转换:

Tuple.Create<long, long>(1, 1);
Run Code Online (Sandbox Code Playgroud)