如何在 C# 中覆盖默认值(T)? [复制]
Posted
技术标签:
【中文标题】如何在 C# 中覆盖默认值(T)? [复制]【英文标题】:How to override default(T) in C#? [duplicate] 【发布时间】:2012-10-09 05:35:44 【问题描述】:可能重复:Howto change what Default(T) returns in C#
print(default(int) == 0) //true
同样,如果我有一个自定义对象,它的默认值为 null。
print(default(Foo) == null) //true
我可以为default(Foo)
设置一个不为空的自定义值吗?
例如,像这样:
public static override Foo default()
return new Foo();
这不会编译。谢谢..
【问题讨论】:
您可以在 LINQ 查询中使用Enumerable.DefaultIfEmpty
指定它。但不是针对单个对象。 @Neverever:不是重复的,因为 OP 没有提到集合。
你不能,如果你能,那就糟糕了。 new
ing up 那个类型的数组会做什么?是否必须为每个元素调用 default
函数?可怕的想法 - 通常你无论如何都会覆盖它们。但是,您可以假装默认状态实际上不为零(对于值类型),假设您有一个要默认为 2 的字段:创建一个返回该字段加 2 的属性(并在设置时设置 value - 2
),所以零显示为 2。
你可以创建一个静态方法Empty()
,它返回一个类的default实例。你的困难在于你试图用关键字default
来命名它。 @default
可能会起作用。
【参考方案1】:
您不能覆盖 default(T) 关键字。引用类型始终为 null,值类型始终为零。
更多信息
MSDN - default Keyword in Generic Code (C# Programming Guide)【讨论】:
【参考方案2】:看起来不像。来自the documentation:
default
... 将为引用类型返回 null,为数值类型返回零。对于结构,它将返回结构的每个成员,根据它们是值类型还是引用类型,初始化为零或空。
【讨论】:
【参考方案3】:坦率地说,这不是一个真正的答案,而是一个简单的提及。如果Foo
是一个结构,那么你可以有这样的东西:
public struct Foo
public static readonly Foo Default = new Foo("Default text...");
public Foo(string text)
mText = text;
mInitialized = true;
public string Text
get
if (mInitialized)
return mText;
return Default.mText;
set mText = value;
private string mText;
private bool mInitialized;
[TestClass]
public class FooTest
[TestMethod]
public void TestDefault()
var o = default(Foo);
Assert.AreEqual("Default text...", o.Text);
【讨论】:
我认为这是可行的,因为值类型(结构)不能为空。这样就创建了对象。现在,当我们访问该属性时,我们可以返回任何内容。我们没有覆盖默认行为。即使我使用下面的语句,它也会起作用。 public static readonly Foo MyDefault以上是关于如何在 C# 中覆盖默认值(T)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章