【发布时间】:2023-03-13 00:54:01
【问题描述】:
考虑以下结构:
struct SomeWrapper
{
public Guid guid;
public static implicit operator SomeWrapper(Guid guid) => new SomeWrapper {guid = guid};
}
这个结构定义了一个隐式操作符,用于将Guid 视为SomeWrapper,非常简单。
以下所有方法都编译,除了第一个PleaseDoNotCompile:
static Task<SomeWrapper> PleaseDoNotCompile() => Task.Run(() => Guid.NewGuid());
static Task<SomeWrapper> WhyDoYouCompile() => Task.Run(() =>
{
return Guid.NewGuid();
return new SomeWrapper();
});
static SomeWrapper IUnderstandWhyYouCompile() => Guid.NewGuid();
static async Task<SomeWrapper> IUnderstandWhyYouCompileToo() => await Task.Run(() => Guid.NewGuid());
特别是,WhyDoYouCompile 只是第一个带有附加 return 语句返回 SomeWrapper 值的方法。很明显,return 是无法访问的代码。而且它仍然可以编译,而第一个没有。
因此,除了额外的 return 语句之外,这两种方法之间实际上还有另一个区别:PleaseDoNotCompile 使用 Task.Run<Guid>(Func<Guid> function) 而WhyDoYouCompile 使用 Task.Run<SomeWrapper>(Func<SomeWrapper> function)。因此,额外的回报实际上改变了所使用的过载。
尽管如此,IUnderstandWhyYouCompileToo,它只是带有 async 和 await 关键字的 PleaseDoNotCompile,也使用了 Task.Run<Guid>(Func<Guid> function),它确实可以编译。
那么,问题就是为什么PleaseDoNotCompile 不能编译而其他方法可以编译?我错过了什么?
【问题讨论】:
-
因为
Task<Guid>不能转换成Task<SomeWrapper>。
标签: c# .net lambda delegates implicit-conversion