可能有任何`var`可能导致问题的情况吗?

Chr*_*nte 3 .net c# types

我从这个问题中知道var i = 1并且int i = 1在IL中完全相同.编译器只是var在编译时替换实际类型.但是,是否有任何var可能导致问题行为的实例(可能编译器猜错了类型?)

Ant*_*ram 8

我不相信编译器会猜错类型.但是,它可能会推断出您不想​​要的类型,但这并不相同.

考虑完全合法

decimal foo = 10;
decimal bar = 4; 
decimal baz = foo / bar; 
Run Code Online (Sandbox Code Playgroud)

在代码中,baz很明显会是2.5.整数文字将在存储之前转换为小数,然后数学发生在十进制值上.删除显式输入,结果不同.

var foo = 10;
var bar = 4;
var baz = foo / bar;
Run Code Online (Sandbox Code Playgroud)

现在一切都推断为int并且baz是2因为现在数学是用整数进行的.

所以,是的,如果你介绍var之前没有的地方,代码语义理论上可以改变.所以关键是要了解什么类型的推断实际上与你的代码有关,如果你想要一些小数(或任何特定的类型X),请以这样的方式声明它.对于类型推断,那就是

var foo = 10m;
Run Code Online (Sandbox Code Playgroud)