gpt4 book ai didi

c# - 运算符 '?' 不能应用于类型 'T' 的操作数

转载 作者:IT王子 更新时间:2023-10-29 04:26:39 29 4
gpt4 key购买 nike

试图使 Feature 通用,然后编译器突然说

Operator '?' cannot be applied to operand of type 'T'

这是代码

public abstract class Feature<T>
{
public T Value
{
get { return GetValue?.Invoke(); } // here is error
set { SetValue?.Invoke(value); }
}

public Func<T> GetValue { get; set; }
public Action<T> SetValue { get; set; }
}

可以改用这段代码

get
{
if (GetValue != null)
return GetValue();
return default(T);
}

但我想知道如何修复漂亮的 C# 6.0 单行代码。

最佳答案

由于并非所有内容都可以是null,因此您必须将T 缩小为可以为null 的内容(又名对象)。结构不能为空,枚举也不能。

class 上添加 where 确实解决了这个问题:

public abstract class Feature<T> where T : class

那么为什么它不起作用呢?

Invoke() 产生 T。如果 GetValuenull,则 ? 运算符将类型 T 的返回值设置为 null,它不能。例如,如果 Tint,它不能使它可以为 null (int?),因为实际类型需要 (T = int) 不是。

如果您在代码中将 T 更改为 int,您会非常清楚地看到问题。你问的最终结果是这样的:

get
{
int? x = GetValue?.Invoke();
return x.GetValueOrDefault(0);
}

这不是零传播运算符会为您做的事情。如果您恢复使用 default(T),它确实知道该做什么,并且您可以避免“有问题的”空值传播。

关于c# - 运算符 '?' 不能应用于类型 'T' 的操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32580536/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com