我如何使用一個Task<string>
實體作為一個方法的Task<string?>引數?
如果我使用啟用的nullability,并且我有兩個異步方法,比如......
如果我使用啟用的nullability,并且我有兩個異步方法。
//在一個普通的類中。
public async static Task< string> Foo() { . .. }
///在一個靜態類中。
public async static任務 Bar(this Task< string? > task1){ ... }
我試圖呼叫await Foo().Bar();
,但編譯器給我的答案是:
warning CS8620: 型別為'Task<string>'的引數用于型別為'task'的引數'Task<string?
我可以對Foo的結果做什么來使它作為一個Task<string?>被接受?
uj5u.com熱心網友回復:
有一個關于任務無效性協變的提案。
目前,你必須使用! (null-forgiving)運算子來擺脫編譯器的警告:
await FooClass.Foo()!.Bar();
class Program
{
static async Task Main(string[] args)。
{
await FooClass.Foo()! .Bar()。
}
}
public static class Extensions
{
public async static任務 Bar(this Task< string? > task)。
{
System.Console.WriteLine("bar")。
await Task.CompletedTask。
}
}
public class FooClass
{
public async static Task< string> Foo()?
{
System.Console.WriteLine("foo")。
return await Task.FromResult("") 。
}
}
。
uj5u.com熱心網友回復:
你可以將Task<string>
包裹在一個延續中,將結果作為Task<string?>
回傳:
await Foo().ContinueWith<string?> (task => {
try {
return task.Result。
} catch (AggregateException e) {
throw e.InnerExceptions[0]; //傳播例外/取消。
}
}).Bar()。
uj5u.com熱心網友回復: 問題在于,C#的nullable參考型別注解對于通用型別來說是沒有變化的。
這一點可以從這段代碼中得到證明: 雖然我們知道不能回傳null的任務應該被允許代替可以回傳null的任務,但是編譯器并不知道這一點。
編譯這個給出的警告: CS8619:'Task'型別的值中的參考型別的Nullability與目標型別'Task<object?>'不一致。
請注意,這種差異確實適用于委托和介面。但是 例如,這兩個編譯時沒有警告: 有人討論過為 在那之前,你必須使用null forgiveness操作來抑制這些警告。
標籤:ContinueWith
中的lambda運算式必須回傳一個string?
,這在這里是可行的,因為task.Result
是一個string
,它可以隱含地轉換為string?
Task<object> o = Task. FromResult<object>(new object()) 。
Task<object?> p = o;
Task<T>
既不屬于這兩種型別。
IEnumerable<object> c = new[] { new object() };
IEnumerable<object?> d=c;
Action<object?> a = _ => {};
Action<object> b = a。
T
中Task<T>
的無效性在編譯器中添加特殊處理,但它還沒有落地。