可空诊断 CS8621 无故引发

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

我在一个单独的项目中有一个剃刀组件,它定义了如下搜索参数:

[Parameter, EditorRequired]
public Func<string, Task<IEnumerable<T>>> Search { get; set; } = default!;

消费者组件(包含在一个单独的消费项目中)定义了一个搜索函数,如下所示:

async Task<IEnumerable<Combination>> Search(string term)
{
...
}

还有那种可空性分析器喊道:

“Task HandoutForm.Search(string term)”返回类型中引用类型的可为空性与目标委托“Func>>”不匹配(可能是因为可空性属性)。CS8621

我尝试使用 IEnumerable、任务和编译时已知参数与泛型的所有可能组合,通过一个简单的类来重现此问题,但无法重现:

public class Test
{
    public Test()
    {
    }

    public IEnumerable<InnerTest> InnerTests { get; } = [];
    public Task<IEnumerable<InnerTest>> InnerTestsAsync { get; } = Task.FromResult<IEnumerable<InnerTest>>([]);
}

public class GenericTest<T>
{
    public IEnumerable<T> Items { get; } = [];
    public Task<IEnumerable<T>> ItemsAsync { get; } = Task.FromResult<IEnumerable<T>>([]);
    public Func<string, Task<IEnumerable<T>>> Search { get; set; } = default!;
}


public class InnerTest
{
}

var test = new Test();
var innerTests = test.InnerTests;

if (innerTests.Any())
{
    Console.WriteLine("test");
}

var genericTest = new GenericTest<Test>();
var innerGenericTests = genericTest.Items;

if (innerGenericTests.Any())
{
    Console.WriteLine("generic test");
}
var innerGenericTaskTests = await genericTest.ItemsAsync;
if (innerGenericTaskTests.Any())
{
    Console.WriteLine("generic test");
}
genericTest.Search = testSearch; // should be identical as far as nullable goes.

static Task<IEnumerable<Test>> testSearch(string term) => Task.FromResult<IEnumerable<Test>>([]);

据我所知,虽然结构相同,但不会出现任何错误。我能想到的唯一罪魁祸首可能是剃刀预编译器?

任何人都知道如何告诉分析器不要对我进行攻击? 我不明白如何用

NotNull
来装饰 Func 定义,我没有主意了。我只需要 pragma 抑制吗?

.net-core razor nullable
1个回答
0
投票

好的,像往常一样写出问题有助于解决问题,问题确实与剃刀组件的通用参数如何自动推断有关:

<MyComponent @bind-Value=_value" ... />

@code { 
    MyType? _value;
}

这本质上使 T 本身成为

MyType?
,回想起来很明显,这就是为什么搜索函数的返回类型不匹配并大喊。

解决办法有两种,视情况而定:

  1. _value
    更改为不可空
  2. 更改搜索函数实现以返回可为空的。

就我而言,我选择了选项 2,因为我没有默认值。

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