在以下示例中:
void Main()
{
// data can actually NEVER be null, but here it is of type Response?
var data = MyHelper("the method", m => GetData<Response>(m));
}
class Response
{
public int prop { get; set; }
}
TResp? GetData<TResp>(string method)
{
return default(TResp);
}
TResp MyHelper<TResp>(string method, Func<string, TResp> getData)
{
var data = getData(method);
if (data is null)
throw new Exception("data should not be null");
return data;
}
在 main 方法中,数据变量可以为空,但实际上它永远不能为空,我想强制了解这一点。
我不想修改 GetData 方法,因为它可以返回 null
在 main 方法中,数据变量可以为空,但实际上它永远不能为空,我想强制了解这一点。
这是额外的 nullable 属性 可以帮助解决的问题。在这种情况下,您希望将
NotNull
应用于返回值:
[return:NotNull]
TResp MyHelper<TResp>(string method, Func<string, TResp> getData)
在快速测试中,当您使用
data
时,Visual Studio 仍将 Response?
的推断类型显示为 Intellisense 中的 var
,但它“知道”它不为空(您可以调用 data.ToString()
而不会发出警告)示例),如果您明确指定 data
的类型为 Response
(而您之前会这样做),则不会收到任何警告。 (这可能是一个智能感知问题而不是其他问题。)