我有下面的泛型方法,但是VS给了我一个编译错误。(运算符'??‘不能应用于'T‘和’T‘类型的操作数)
public static T Method<T>(T model) where T : new()
{
var m = model ?? new T();
}有人知道为什么吗?
编辑:有没有可能是因为在我的例子中,T可以是一个结构体,而结构体是一个不可空的类型?
发布于 2013-06-13 14:22:18
您应该添加class约束:
public static T Method<T>(T model) where T : class, new()
{
var m = model ?? new T();
return m;
}你也应该返回m!
注意:正如@KristofDegrave在他的评论中提到的,我们必须添加class约束的原因是因为T可以是值类型,就像int一样,并且由于??运算符(空合并)检查可以为空的类型,所以我们必须添加class约束来排除值类型。
编辑: Alvin Wong的答案也涵盖了可空类型的情况;这些类型实际上是结构,但可以是??的操作数。操作符。只需注意,对于可为空的类型,Method将返回null,而不包含Alvin的重载版本。
发布于 2013-06-13 14:21:30
??是空合并运算符。它不能应用于不可为空的类型。因为T可以是任何类型,所以它可以是int或其他原始的、不可为空的类型。
如果添加条件where T : class (必须在new()之前指定),它会强制T成为一个可以为空的类实例。
发布于 2013-06-13 17:14:05
许多人已经指出,为泛型添加class约束将解决问题。
如果你希望你的方法也适用于Nullable<T>,你可以为它添加一个重载:
// For reference types
public static T Method<T>(T model) where T : class, new()
{
return model ?? new T();
}
// For Nullable<T>
public static T Method<T>(T? model) where T : struct
{
return model ?? new T(); // OR
return model ?? default(T);
}https://stackoverflow.com/questions/17080403
复制相似问题