首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运算符'??‘不能应用于'T‘和'T’类型的操作数

运算符'??‘不能应用于'T‘和'T’类型的操作数
EN

Stack Overflow用户
提问于 2013-06-13 14:17:28
回答 8查看 6.5K关注 0票数 54

我有下面的泛型方法,但是VS给了我一个编译错误。(运算符'??‘不能应用于'T‘和’T‘类型的操作数)

代码语言:javascript
复制
public static T Method<T>(T model) where T : new()
{
    var m = model ?? new T();
}

有人知道为什么吗?

编辑:有没有可能是因为在我的例子中,T可以是一个结构体,而结构体是一个不可空的类型?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-06-13 14:22:18

您应该添加class约束:

代码语言:javascript
复制
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的重载版本。

票数 58
EN

Stack Overflow用户

发布于 2013-06-13 14:21:30

??是空合并运算符。它不能应用于不可为空的类型。因为T可以是任何类型,所以它可以是int或其他原始的、不可为空的类型。

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

票数 86
EN

Stack Overflow用户

发布于 2013-06-13 17:14:05

许多人已经指出,为泛型添加class约束将解决问题。

如果你希望你的方法也适用于Nullable<T>,你可以为它添加一个重载:

代码语言:javascript
复制
// 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);
}
票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17080403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档