C# 等待项目。任务<;布尔>;()以便项可以为空

C# 等待项目。任务<;布尔>;()以便项可以为空,c#,asynchronous,async-await,C#,Asynchronous,Async Await,在异步方法中,我执行如下调用: bool result=wait SomeClassInstance.GetResultAsync(); GetResultAsync()返回一个任务,因此可以等待 但是,SomeClassInstance可能为空。在这种情况下,我希望结果为假,即具有如下内容: bool result=wait SomeClassInstance?.GetResultAsync(); 或 bool result=wait SomeClassInstance.GetResult

在异步方法中,我执行如下调用:

bool result=wait SomeClassInstance.GetResultAsync();
GetResultAsync()
返回一个
任务,因此可以等待

但是,
SomeClassInstance
可能为空。在这种情况下,我希望
结果
,即具有如下内容:

bool result=wait SomeClassInstance?.GetResultAsync();

bool result=wait SomeClassInstance.GetResultAsync()??虚假的;
然而,这似乎是不可能的,因为我的第一个提议抛出了一个
NullReferenceException
,第二个提议将不会编译,因为
。GetResultAsync()
的计算结果是
bool
,而不是
bool?
,因此
无法应用

我要监督什么吗?或者这在c#中是不可能的?


(我知道一些变通方法,如:
bool result=SomeClassInstance!=null&&wait SomeClassInstance.GetResultAsync();

可以采用不同的方法,例如:

// #1
bool result = await (SomeClassInstance?.GetResultAsync() ?? Task.FromResult(false));
// #2
bool result = SomeClassInstance != null : await SomeClassInstance.GetResultAsync() : false;
如果您试图使调用
GetResultAsync
更紧凑并避免空检查,那么您应该确保
SomeClassInstance
从不为空,或者您可以用另一种方法将调用包装为空,如下所示:

class SomeClass
{
    private SomeClassInstance { get; set; }

    public async Task<bool> GetNullSafeResult()
    {
        return await (SomeClassInstance?.GetResultAsync() ?? Task.FromResult(false));
    }
}
class-SomeClass
{
私有SomeClassInstance{get;set;}
公共异步任务GetNullSafeResult()
{
返回等待(SomeClassInstance?.GetResultAsync()?Task.FromResult(false));
}
}

然后总是调用
GetNullSafeResult
,而不是直接使用
SomeClassInstance

我已经提到过的第二个解决方案。你的第一个似乎也很有效,而且可能是我要坚持的。您知道是否可以在
SomeClassInstance中返回某些内容。Get
返回
任务。FromResult(false)
?@lean但我不确定是否遵循了问题。您希望能够调用
SomeClassInstance.Get
,即使
SomeClassInstance
为空?可以这样说
SomeClassInstance
封装在另一个类中,即
SomeClass.SomeClassInstance
SomeClass
然后为
SomeClassInstance
设置一个
get
set
。对于nice代码,最好是在
SomeClass.SomeClassInstance.Get
任务中返回FromResult(false)
或其他东西。@Leander由于getter必须返回
SomeClassInstance
-键入一个
任务将不适合getter的签名,因此不能这样做。但我也会说这不是一个好的设计方法。如果您希望有一个易于调用的方法,我建议将调用包装到
GetResultAsync
-我将用一个示例更新我的问题1秒。。。