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

C#:指定“的行为”;“违约”;使用泛型时的关键字,c#,generics,C#,Generics,是否可以指定我自己的默认对象而不是空对象?我想在某些对象上定义自己的默认属性 例如,如果我有一个属性为bar和baz的对象foo,而不是默认的returing null,我希望它是一个属性为bar设置为“abc”,baz设置为“def”的foo实例——这可能吗?不可能。抱歉。您必须使用构造函数才能获得该功能。因此,不能使用默认值 但若您的目标是确保泛型类中传递类型的特定状态,那个么还是有希望的。如果要确保传递的类型是可实例化的,请使用泛型约束。新的()约束。这确保了T类型有一个公共的无参数构造函

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


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

不可能。抱歉。

您必须使用构造函数才能获得该功能。因此,不能使用默认值

但若您的目标是确保泛型类中传递类型的特定状态,那个么还是有希望的。如果要确保传递的类型是可实例化的,请使用泛型约束。新的()约束。这确保了T类型有一个公共的无参数构造函数

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

    private void SomeMethod() {
        T myT = new T();
        //work with myT
    }
}
公共类GenericClass,其中T:new(){
//类定义
私有方法(){
T myT=新的T();
//与myT合作
}
}
不幸的是,您不能使用此工具获取具有参数的构造函数,只能获取无参数的构造函数。

您不能使用“default”,但可能这不是正确的工具

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

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

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

a = new Container<foo>();

// a.MaybeFoo is null;
公共类foo
{
公共字符串bar=“abc”;
}
公营货柜
{
T MaybeFoo=默认值;
}
a=新容器();
//a.MaybeFoo为空;
换句话说,“default”不会创建实例

但是,如果您愿意保证类型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"
公共类foo
{
公共字符串bar=“abc”;
}
公共类容器,其中T:new()
{
T MaybeFoo=新的T();
}
a=新容器();
Console.WriteLine(((Foo)a.MaybeFoo.bar)//打印“abc”

default(T)仍然为空,但是+我想知道我真正想做什么。你也得到了复选标记。谢谢对符合事实的我回答的第一行说,不可能使用默认值,但我猜问题的真正含义是什么,可以使用不同的方法实现,而不是默认值。您的方法是正确的,但关键是new()泛型约束请注意,对于结构,不允许使用无参数构造函数,因此如果需要对结构使用相同的行为,则必须进行更多的编码。