如何在 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 没有提到集合。 你不能,如果你能,那就糟糕了。 newing 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)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C# protobuf-net - 默认值覆盖 protobuf 数据中的值

C#中用户定义类的默认值

c#中泛型类型的默认值[重复]

如何从命名空间导出,访问默认值? [复制]

C# 的默认值(T)的 VB 等效项

在C#中如何设置label的默认值