C#泛型:成员的默认非空值

时间:2015-04-15 17:07:06

标签: c# generics

在这个通用"类":

public class Param<ValueType>{
    public ValueType value;
}

ValueTypestring时,我希望value对于所有新创建的类实例都是非null,而不通过构造函数显式传递默认值。在我的方案中,ValueType只能是intfloatboolstringstruct(不需要public class Param<ValueType> where ValueType: new(){ public ValueType value = new ValueType(); } 执行)。

我该怎么做?

当我尝试这样做时:

new ValueType()

类停止接受字符串。

当我删除new()约束时,我无法再使用value(显然),Param<string>对于.Equals()的所有新实例都为空。

我该怎么办?

我希望这种情况发生的原因是因为我value.Equals(other.value)定义了value,这会导致{{1}}为空时抛出异常。

1 个答案:

答案 0 :(得分:3)

你可以:

public class Param<ValueType>
{
    public ValueType value = typeof(ValueType) == typeof(string) ? (ValueType)(object)string.Empty : default(ValueType);
}

请注意default(int) == 0等等。

啊,为了比较,你应该:

bool areEqual = EqualityComparer<ValueType>.Equals(value, other.Value);

它适用于null值。

即使使用泛型,也请注意:

if (value == null)
{

}

是完全有效的代码。显然,只有当ValueType可以null并且null时才会成立(因此ValueType == int不会发生这种情况)