return 类型 'T? Manager<T>.Strategy.get' 中引用类型的可空性与隐式实现的成员 'T IManager<T>.Strategy.get' 不匹配

Nullability of reference types in return type 'T? Manager<T>.Strategy.get' doesn't match implicitly implemented member 'T IManager<T>.Strategy.get'

使用 C# 10 我有:

public interface IStrategy<T> where T: Options { 
  T Options { get; }
}

public abstract class Strategy<T> : IStrategy<T> where T : Options {
  public abstract T Options { get; }
}

public interface IManager<T> where T: IStrategy<Options> {
  T Strategy { get; set; }
  Task Run();
}

public class Manager<T> : IManager<T> where T : IStrategy<Options> {

  public String Name { get; set; } 
  public T? Strategy { get; set; }

  public Manager(String name) {
    Name = name;
  }
}

我收到警告:

Nullability of reference types in return type of 'T? Manager<T>.Strategy.get' doesn't match implicitly implemented member 'T IManager<T>.Strategy.get' (possibly because of nullability attributes).  

我知道 Strategy 在管理器中可能为空,因为它可能稍后设置而不是在构造函数中设置。

但策略中的选项永远不会为空。

我一直在将 T 更改为 T?,但我总是在某处收到警告。

如何解决这个问题?

你可以,但是你在你的泛型中说你不希望 T 为空,那么你有一个 属性 其 getter (那是 T IManager<T>.Strategy.get) 可能 return a null T:这就是您收到的警告。仅使用托管代码而不从外部读取(除非您明确强制使用 null),这永远不会发生(Strategy 永远不会 return null

你能做到:

public class Manager<T> : IManager<T?> where T : IStrategy<Options> 
// Notice the ? in IManager<T?>

警告应该会消失,但想想这是否是您真正想要的(这正是可空引用类型注释的用途)

我做了一个fiddle:https://dotnetfiddle.net/ccar24