C#:使用泛型时指定“default”关键字的行为

时间:2008-12-18 20:17:53

标签: c# generics

是否可以指定我自己的默认对象而不是null?我想在某些对象上定义自己的默认属性。

例如,如果我有一个带有属性bar和baz的对象foo,而不是默认的returing null,我希望它是foo的一个实例,bar设置为“abc”,baz设置为“def” - - 这可能吗?

3 个答案:

答案 0 :(得分:5)

您必须使用构造函数来获取该功能。所以,你不能使用默认值。

但是如果你的目标是确保泛型类中传递类型的某种状态,那么可能仍然存在希望。如果要确保传递的类型是可实例化的,请使用通用约束。 new()约束。这确保了T类型的公共参数构造函数。

public class GenericClass<T> where T : new() {
    //class definition

    private void SomeMethod() {
        T myT = new T();
        //work with myT
    }
}

不幸的是,你不能使用它来获取具有参数的构造函数,只能使用无参数构造函数。

答案 1 :(得分:2)

不,你不能。遗憾。

答案 2 :(得分:2)

你不能使用“默认”,但也许这不是正确的工具。

详细说明,“default”会将所有引用类型初始化为null。

public class foo
{
    public string bar = "abc";
}

public class Container<T>
{
    T MaybeFoo = default;
}

a = new Container<foo>();

// a.MaybeFoo is null;

换句话说,“默认”不会创建实例。

但是,如果你愿意保证类型T有一个公共构造函数,你也许可以实现你想要的。

public class foo
{
    public string bar = "abc";
}

public class Container<T> where T : new()
{
    T MaybeFoo = new T();
}

a = new Container<foo>();

Console.WriteLine( ((Foo)a.MaybeFoo).bar )  // prints "abc"