繁体   English   中英

为什么我们不能声明var a = new List <string> 在课堂上?

[英]Why can't we declare var a = new List<string> at class level?

我知道我们不能在课堂上这样做,但在方法层面,我们总能做到这一点。

var myList=new List<string> // or something else like this

这个问题出现在我的脑海中,因为无论我们在哪里声明这样的变量。 我们总是在表达式的RHS中提供类型信息。 所以编译器不需要做类型猜测。 (如果我错了,请纠正我)。

所以问题仍然是为什么不在班级,而在方法层面允许

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

请参阅Eric Lippert的博客,以获得深入的解释: 为什么没有字段变量?

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

它完全是编译魔术,并且编译器实际上没有在IL中写入“在运行时找出类型”,它知道类型并构建它,因此它也可以为成员完成。

它只是没有。

我很确定如果你问C#编译器团队中的一个实际的编译人员,你会得到正式的东西,但这里没有任何魔法发生,并且应该可以为成员字段做同样的事情。

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

你的例子陈述

var myList=new List<string>

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

通用列表类型通用

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();
    }
}

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

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

我真正喜欢的是类型推理const

public const notFoundStatus = 404; // int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM