加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 分配给接口数组initializator编译,但为什么?

发布时间:2020-12-15 18:27:16 所属栏目:百科 来源:网络整理
导读:今天我在想,做一些接口类型的匿名对象是一件很好的工作,而我在SO上看到,我不仅仅是一个. 在我开始查看发生了什么之前,我写了一些如下所示的代码. 对于我的娱乐,它编译,我使用.net框架4,我知道没有办法做匿名对象实现接口,但我没有看到VS的这个代码的抱怨. 更
今天我在想,做一些接口类型的匿名对象是一件很好的工作,而我在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; }
    }
}

解决方法

Holder holder = new Holder { someInterface = { Property = 1 } };//<--Note you missed new keyword

上线等于

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

这应该是这样的

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

注意:您的代码从未引入“匿名类型”它是一个“对象初始化程序”.

当您使用ObjectInitializer语法与新关键字时,这意味着您正在设置某些东西,当您使用ObjectInitializer语法没有新的关键字,这意味着您正在阅读的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读