【问题标题】:Converting C# 8.0 to C# 7.0将 C# 8.0 转换为 C# 7.0
【发布时间】:2020-06-27 13:05:31
【问题描述】:

我正要使用下面的 C# 代码。

await using (var producerClient = new EventHubProducerClient(ConnectionString, EventHubName))
{
    using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();
    eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes(eventData)));
    await producerClient.SendAsync(eventBatch);
}

但是在构建服务器中这会失败,因为上面是 C# 8.0 代码并且构建服务器只支持 C# 7.0 代码。有人可以帮我将上面的代码从 C# 8.0 转换为 C# 7.0,因为我无法让它工作吗?

【问题讨论】:

  • 对第二个using 的范围使用大括号(就像第一个using 已经在做的那样)。
  • 另一个问题可能是await usingRelated
  • 为什么不直接修复构建服务器?
  • 如果可以在本地编译代码,可以尝试使用ILSpy将其反编译为旧语言版本的等效代码。
  • 我现在更担心你有这段代码但不明白它在做什么。所以请继续使用下面斯蒂芬的答案,但请在继续之前弄清楚这段代码在做什么。

标签: c# asynchronous async-await using c#-7.0


【解决方案1】:

从长远来看,更新构建服务器肯定会更好。无论如何,您迟早需要这样做。

C# 8.0 有 using declarations,它转换了这个:

using var x = ...;
...

进入这个:

using (var x = ...)
{
  ...
}

此代码中的另一个 C# 8.0 功能是 await usingwhich transforms 代码如下:

await using (var x = ...)
{
  ...
}

变成类似这样的东西:

var x = ...;
try
{
  ...
}
finally
{
  await x.DisposeAsync();
}

手动应用这两种转换可以:

var producerClient = new EventHubProducerClient(ConnectionString, EventHubName);
try
{
  using (EventDataBatch eventBatch = await producerClient.CreateBatchAsync())
  {
    eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes(eventData)));
    await producerClient.SendAsync(eventBatch);
  }
}
finally
{
  await producerClient.DisposeAsync();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2011-12-24
    相关资源
    最近更新 更多