是否存在“var”可能导致问题的情况

本文关键字:问题 情况 存在 var 是否 | 更新日期: 2023-09-27 17:51:26

我从这个问题中知道,在IL中var i = 1int i = 1完全相同。编译器只是在编译时用实际类型替换var。但是,是否存在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将导致编译器错误。