请问 C# 中的 !. 与 null! 感叹号操作符起什么作用呢?

在.Net 源码中看到这四种感叹号操作符的用法,感觉有点像 ?. 和 ?? 操作符,请问它们起到什么作用呢?谢谢

public static IWebHost Start(RequestDelegate app) =>Start(url: null!, app: app);

var startupAssemblyName = app.GetMethodInfo().DeclaringType!.GetTypeInfo().Assembly.GetName().Name;

var hostingStartup = (IHostingStartup)Activator.CreateInstance(attribute.HostingStartupType)!;

public IWebHostEnvironment HostingEnvironment { get; set; } = default!;

我自己找到了答案,在此更新一下,希望能帮到有同样疑惑的同学,依然感谢在该问题下解答的热心朋友。

这是 C#8 的新特性,从 C#8 起引用类型将默认不允许为空,除非使用“?”显式地声明该变量可空,否则赋空值时编译器将显示警告,而带有感叹号的“= null!”可以避免该警告,同样地,在 DeclaringType!.GetTypeInfo() 中由于 DeclaringType 是可空引用类型,通过使用“!.”可以避免编译器的空引用警告。
不过因为这一改动影响较大,这些警告目前在编译器中默认是关闭的
参考链接:

C#7新语法,表示
if (app.GetMethodInfo().DeclaringType != null)
app.GetMethodInfo().DeclaringType.GetTypeInfo();