如何强制泛型方法永远不返回空值

问题描述 投票:0回答:1

在以下示例中:

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

c# generics nullability
1个回答
2
投票

在 main 方法中,数据变量可以为空,但实际上它永远不能为空,我想强制了解这一点。

这是额外的 nullable 属性 可以帮助解决的问题。在这种情况下,您希望将

NotNull
应用于返回值:

[return:NotNull]
TResp MyHelper<TResp>(string method, Func<string, TResp> getData)

在快速测试中,当您使用

data
时,Visual Studio 仍将
Response?
的推断类型显示为 Intellisense 中的
var
,但它“知道”它不为空(您可以调用
data.ToString()
而不会发出警告)示例),如果您明确指定
data
的类型为
Response
(而您之前会这样做),则不会收到任何警告。 (这可能是一个智能感知问题而不是其他问题。)

© www.soinside.com 2019 - 2024. All rights reserved.