运营商“??” 不能应用于'T'和'T'types的操作数

我有以下通用的方法,但VS给了我一个编译错误。 (运算符'??'不能用于'T'和'T'types的操作数)

public static T Method<T>(T model) where T : new() { var m = model ?? new T(); } 

有人知道为什么吗?

编辑:是否有可能的原因是T可以是一个结构在我的情况下,一个结构是一个非空types?

你应该添加class约束:

 public static T Method<T>(T model) where T : class, new() { var m = model ?? new T(); return m; } 

你也应该回来

注意:由于@KristofDegrave在他的评论中提到,我们必须添加class约束的原因是因为T可以是一个值types,如int和自?? 运算符(null-coalescing)检查可以为null的types,所以我们必须添加class约束来排除值types。

编辑:Alvin Wong的回答也涵盖了可空types的情况。 这实际上是结构,但可以是操作数? 运营商。 只是要知道, Method将返回null没有Alvin的重载版本,可为空types。

?? 是空合并运算符。 它不能应用于不可空的types。 由于T可以是任何东西,它可以是一个int或其他原始的,不可为空的types。

如果添加where T : class (必须在new()之前指定new()的条件where T : class则强制T成为可为空的类实例。

许多人已经指出,为class添加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); } 

您需要指定您的Ttypes是对genericstypes具有约束的类:

 public static T Method<T>(T model) where T : class, new() { return model ?? new T(); } 

由于T可以是任何types,所以不能保证T会有静态的? 或者typesT是可空的。

?? 运算符(C#参考)

?? 运算符称为空合并运算符,用于定义空的值types或引用types的默认值。

由于某种原因?? 运算符不能用于非空types,即使它应该等价于model == null ? new T() : model model == null ? new T() : model ,并允许你与一个不可为空的types进行空比较。

您可以使用三元运算符或if语句来获得您正在查找的内容,而无需任何其他限制:

 public static T Method<T>(T model) where T : new() { var m = model == null ? new T() : model; } 

model ?? new T() model ?? new T()意味着model == null ? new T() : model model == null ? new T() : model 。 不能保证模型是不可空的,并且==不能被应用于null和一个不可为空的对象。 改变约束到where T : class, new()应该工作。

把T标记为“class级”,你很好走。