我在一个单独的项目中有一个剃刀组件,它定义了如下搜索参数:
[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 抑制吗?
好的,像往常一样写出问题有助于解决问题,问题确实与剃刀组件的通用参数如何自动推断有关:
<MyComponent @bind-Value=_value" ... />
@code {
MyType? _value;
}
这本质上使 T 本身成为
MyType?
,回想起来很明显,这就是为什么搜索函数的返回类型不匹配并大喊。
解决办法有两种,视情况而定:
_value
更改为不可空就我而言,我选择了选项 2,因为我没有默认值。