我正在尝试完成我的项目,并用各自的Resharper / Jetbrains注释对我的所有方法进行注释,所以当我不小心尝试传递不属于某个地方的内容时,我会得到一些帮助和冲击。
但是,这是我无法理解的。
请考虑以下内容:
public interface ITestClass
{
Task<int?> TestMethod([CanBeNull] int? testInput);
}
public class TestClass : ITestClass
{
public async Task<int?> TestMethod(int? testInput)
{
return await Task.FromResult(testInput);
}
}
public class TestConsumer
{
[NotNull]
private readonly ITestClass m_tester;
[NotNull]
private readonly TestClass m_tester2;
public TestConsumer([NotNull] ITestClass tester, [NotNull] TestClass tester2)
{
m_tester = tester;
m_tester2 = tester2;
}
public async Task TestMethod([NotNull] int? testInput)
{
var test1 = await m_tester.TestMethod(testInput);
var test2 = await m_tester2.TestMethod(testInput);
}
}
为了显示我现在面临的问题,我对此进行了重新构建。通常,我正在使用依赖项注入,并且期望在我的构造函数中某些服务的接口(在这种情况下,让'ITestClass'是服务'TestClass'的接口)。控制器(请参见“ TestConsumer”)。
但是,R#/ Jetbrains注释显然不喜欢这样。但是,当我尝试使用该接口的实现代替时-没问题。
这确实有点烦人。我现在不想摆弄我的整个代码。显然,这在处理等待/异步代码时也只是一个问题,因为如果我不使用“等待”,这在两种情况下都适用,但这不是一种选择。
有什么解决办法吗?最后,R#在实现中的接口中可能会丢失什么?方法定义在那里。
编辑:
有关其他信息:
我正在Visual Studio Enterprise 2017 15.6.1版中运行Resharper Ultimate 2018.3.1。
答案 0 :(得分:3)
实现(TestClass.TestMethod)是一个异步方法,该方法返回Task的实例,并且从不返回null。接口方法“ ITestClass.TestMethod”的签名不能保证结果不为空(您可以使用仅返回null的非异步方法来实现该结果)。因此,在“悲观”分析模式下,ReSharper假定“ ITestClass.TestMethod”可以返回null。要修复它,您可以在接口的方法中添加“ NotNull”注释:
public interface ITestClass
{
[NotNull] Task<int?> TestMethod([CanBeNull] int? testInput);
}