分配给接口数组初始化器编译但为什么?

Mat*_*usz 10 c#

今天我觉得制作一个接口类型的匿名对象是很好的,我在SO上看到我不仅仅是一个.

在我开始查看发生了什么之前,我写了一些代码,如下所示.为了我的娱乐它编译,我使用.net框架4,我知道没有办法做匿名对象实现接口,但我还没有看到VS对此代码的投诉.

更好的是,当我把括号intelisense发现我的界面的"属性",就像它是有效的代码.

为什么这篇文章正在编译,何时运行它会给出null引用异常?

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Holder holder = new Holder { someInterface = { Property = 1 } };
            Console.WriteLine(holder.someInterface.Property);
        }
    }

    class Holder
    {
        public ISomeInterface someInterface{get; set;}
    }

    interface ISomeInterface
    {
        int Property { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sri*_*vel 10

Holder holder = new Holder { someInterface = { Property = 1 } };//<--Note you missed new keyword
Run Code Online (Sandbox Code Playgroud)

上面的行等于

Holder temp = new Holder();
temp.someInterface.Property = 1;
Holder holder = temp;// <--Here someInterface is null so you get null reference exception. 
Run Code Online (Sandbox Code Playgroud)

这应该是这样的

Holder holder = new Holder { someInterface = new SomeClass(){ Property = 1 } };//<--Note the new keyword here
Run Code Online (Sandbox Code Playgroud)

注意:您的代码从未引入过"匿名类型"它是一个"对象初始化器".

当您使用带有new关键字的ObjectInitializer语法时,这意味着您正在设置某些内容,当您使用不带new关键字的ObjectInitializer语法时, 这意味着您正在阅读某些内容.

  • 一个小的修正,这相当于`Holder temp = new Holder(); temp.someInterface.Property = 1; 持有人持有人=临时;`.属性赋值在*`holder`初始化之前发生*.想象一下,如果`holder`是一个静态场; 你不希望该属性能够读取该字段并获得新对象,对吗? (3认同)