C#调用Azure Service Bus异步方法报CS0029类型转换错误如何修复
问题说明
运行基础Azure Service Bus示例代码时出现编译错误,初始代码如下:
using System; using Azure.Messaging.ServiceBus.Administration; namespace helloapp { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); string connectionString = "<connection_string>"; ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString); NamespaceProperties props = client.GetNamespacePropertiesAsync(); } } }
编译抛出错误:
Error CS0029: Cannot implicitly convert type 'System.Threading.Tasks.Task<Azure.Response<Azure.Messaging.ServiceBus.Administration.NamespaceProperties>>' to 'Azure.Messaging.ServiceBus.Administration.NamespaceProperties' (CS0029) (helloapp)
尝试直接给方法调用加await关键字:
NamespaceProperties props = await client.GetNamespacePropertiesAsync();
依然无法通过编译。
报错原因
报错来自三个C#异步编程的基础语法问题:
- 所有带
Async后缀的异步方法返回值是Task<T>类型,不加await直接赋值,必然出现类型不匹配的编译错误 await关键字只能在被async修饰的方法内使用,原代码的Main方法没有加async修饰,直接写await本身就不符合语法要求GetNamespacePropertiesAsync()返回的结果被Azure.Response<T>类型包裹,必须访问.Value属性,才能拿到需要的NamespaceProperties实例
修复方案
提供两种可直接运行的修复方式:
方式1:使用标准异步写法(推荐)
将Main方法修改为异步入口,补充缺失的using引用,正确获取返回值即可,完整代码如下:
using System; using System.Threading.Tasks; using Azure.Messaging.ServiceBus.Administration; namespace helloapp { class Program { // 给Main方法加async修饰,返回值改为Task static async Task Main(string[] args) { Console.WriteLine("Hello World!"); string connectionString = "<connection_string>"; ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString); // 加await等待异步结果,同时访问Value属性拿到NamespaceProperties实例 NamespaceProperties props = (await client.GetNamespacePropertiesAsync()).Value; // 后续可正常操作props对象,例: // Console.WriteLine($"当前命名空间:{props.Name}"); } } }
注意:异步Main方法需要C# 7.1及以上版本支持,目前.NET Core 3.1、.NET 5及以上版本的默认开发环境都自动支持该语法,无需额外配置。
方式2:使用同步方法调用
如果不需要异步逻辑,可以直接调用SDK提供的同步版本方法GetNamespaceProperties(),不需要修改Main方法签名,代码如下:
using System; using Azure.Messaging.ServiceBus.Administration; namespace helloapp { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); string connectionString = "<connection_string>"; ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString); // 同步方法不需要await,同样访问Value属性获取结果 NamespaceProperties props = client.GetNamespaceProperties().Value; } } }
内容的提问来源于stack exchange,提问作者John Little
相关产品推荐
相关产品推荐

