运营商“??” 不能应用于'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); }
您需要指定您的T
types是对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级”,你很好走。