是否存在“var”可能导致问题的情况
本文关键字:问题 情况 存在 var 是否 | 更新日期: 2023-09-27 17:51:26
我从这个问题中知道,在IL中var i = 1
和int i = 1
完全相同。编译器只是在编译时用实际类型替换var
。但是,是否存在var
可能导致问题行为的任何实例(可能编译器猜测错误的类型?(
我不相信编译器会猜错类型然而,它可能会推断出一个你不打算的类型,但这并不相同。
考虑一下完全合法的
decimal foo = 10;
decimal bar = 4;
decimal baz = foo / bar;
在代码中,baz
将非常清楚地为2.5。在存储之前,整数文字将被转换为小数,然后对小数值进行数学运算。删除显式类型,结果会有所不同。
var foo = 10;
var bar = 4;
var baz = foo / bar;
现在一切都推断为int,baz
是2,因为现在数学是用整数进行的。
所以,是的,如果在var
之前引入它,代码语义理论上可能会发生变化。因此,关键是要了解类型推理对代码的真正作用,如果你想让某个东西是十进制的(或任何特定的X类型(,就用这样的方式声明它
var foo = 10m;
不,我不这么认为。它唯一无法解决的问题是,如果你尝试做一些类似的事情
var product = null;
这是有道理的,在这种情况下,您会得到一个编译错误。
它不会引起任何"问题",但对于代码,您可能会遇到回归问题。。。
IObject1
{
void DoSomething();
}
IObject2
{
void DoSomething();
}
var result = SomeMethod();
result.DoSomething();
现在,如果SomeMethod返回IObject1,然后被更改为返回IObject2,那么它仍然会编译但是,如果您希望DoSomething执行特定的代码,那么这可能是一个回归问题。
但是,如果你有
IObject1 result = SomeMethod();
如果SomeMethod的返回类型发生了更改,您将立即知道它。
除了歧义之外:
var x = null;
编译器也不会推断重载方法组的类型:
var m = String.Equals;
它也不会推断lambda表达式的类型,它可以是Func<>
或Expression<Func<>>
:
var l = (int x) => x + 1;
尽管如此,Anthony是对的:编译器永远不会做错事,尽管它可能不会做你期望的事情。如果有疑问,请将鼠标悬停在VS中的var
上以查看静态类型。
var x = 0
x = 0.10
Cannot convert source type 'double' to target type 'int'
一个例子:
double x = 0; //to initialize it
switch (something) {
case condition1:
x = 0.1;
break;
case condition2:
x = 0.2;
break;
}
使用var
而不是double
将导致编译器错误。