C# C中的非空类默认值#

C# C中的非空类默认值#,c#,class,struct,default-value,C#,Class,Struct,Default Value,如果我default(RefType)我得到null。如果我default(ValType)我会得到一个ValType,带有default-ed属性。那很好 但是我想要一个带有val typedefault语义的ref类型;特别是对于亚型。这可能吗 比如说,我公开了一个接口,IExtension。 有人将其作为类实现为footextension 如何最容易地将footextension的“default”实例作为“空”类(以及同样重要的footextension派生的类型)获取,而无需更改实现

如果我
default(RefType)
我得到
null
。如果我
default(ValType)
我会得到一个
ValType
,带有
default
-ed属性。那很好

但是我想要一个带有val type
default
语义的ref类型;特别是对于亚型。这可能吗

比如说,我公开了一个接口,
IExtension
。 有人将其作为类实现为
footextension
如何最容易地将
footextension
的“
default
”实例作为“空”类(以及同样重要的
footextension
派生的类型)获取,而无需更改实现

这对我很重要;我需要创建非空的派生类型的“空”实例,以便它们可以由动态UI填充

我猜答案可能是通过反射迭代属性的效果,但也许有更好的(读:更干净)方法

我只想使用结构,但是不可继承的约束,再加上我描述的类型的语义是错误的,这让我很警惕(阅读:No)


tl;dr:如何获得默认类,如默认结构,隐式支持继承。

一个选项是分配实例而不调用任何构造函数。通常,除非最终调用其中一个类型构造函数或完全初始化对象,否则这是非常令人困惑的。顾名思义,它用于从序列化数据创建对象,但可能没有0-arity构造函数。

可能重复的
default
关键字对于引用类型总是返回null,因此这不在表中。也许您可以使用
Activator.CreateInstance(typeof(footextension))
来创建这些空实例,并要求实现者始终提供一个没有参数的构造函数。“这可能吗?”不可能!传递一个函数来创建默认实例,如
UseAnExtension(()=>newfootextension())
@mikez,但我不能在C#中强制使用非属性构造函数。我更愿意让它万无一失。我的意思是,如果你想要一些巫毒,有一个可以创建实例而不调用任何构造函数的。一般来说,除非你最终调用其中一个类型构造函数,否则这是非常令人困惑的。谢谢@mikez,有没有一个例子说明你想递归地使用它?至于为后续的填充实例化一个完整的对象图吗?@Dan我想你可以这样做,但需要对细节进行一些分析。如何知道子对象上的某些属性已设置?如何处理集合类型(数组、列表、字典)?