为什么我们不能在类级别声明 var a = new List

本文关键字:new List string var 声明 不能 我们 为什么 | 更新日期: 2023-09-27 17:47:23

我知道我们不能在类级别执行此操作,但在方法级别,我们始终可以执行此操作。

var myList=new List<string> // or something else like this
这个问题

从我们像这样声明变量的任何地方就浮现在我的脑海中。我们始终在表达式的 RHS 处提供类型信息。 因此,编译器不需要进行类型猜测。(如果我错了,请纠正我)。

所以问题仍然是为什么不在类级别,而在方法级别允许

为什么我们不能在类级别声明 var a = new List<string>

实现此功能存在技术问题。 常见情况看起来很简单,但更难的情况(例如,在链或循环中引用其他字段的字段,包含匿名类型的表达式)并非如此。

请参阅Eric Lippert的博客以获取深入的解释:为什么字段上没有var?

编译器人员只是没有实现支持。

这完全是编译器的魔术,编译器实际上并没有在 IL 中放入一些"在运行时找出类型"的东西,它知道类型并内置它,所以它也可以为成员做到这一点。

它只是没有。

我很确定,如果你问一个C#编译器团队中真正的编译器人员,你会得到一些官方的东西,但这里没有发生魔法,应该可以对成员字段做同样的事情。

var 关键字是专门为支持匿名类型而发明的。您通常不会在类级别声明匿名类型,因此它没有实现。

您的示例语句

var myList=new List<string>

不是如何使用 var 关键字的一个很好的例子,因为它不是为了预期目的。

这并不像在方法中实现 var 那么简单,因为您还必须考虑不同的修饰符和属性,如下所示:

[MyAttribute()] protected internal readonly var list = new List<T>();

我真正想要的是一个类型推断的 const

public const notFoundStatus = 404; // int

传递泛型中的列表类型

class Class1
{
    public void genmethod<T>(T i,int Count)
    {

        List<string> list = i as List<string>;
        for (int j = 0; j < Count; j++)
        {
            Console.WriteLine(list[j]);
        }
    }
    static void Main(string[] args)
    {
        Class1 c = new Class1();
        c.genmethod<string>("str",0);
        List<string> l = new List<string>();
        l.Add("a");
        l.Add("b");
        l.Add("c");
        l.Add("d");
        c.genmethod<List<string>>(l,l.Count);
        Console.WriteLine("abc");
        Console.ReadLine();
    }
}