gpt4 book ai didi

c# - Func 隐式转换为 MyType

转载 作者:太空狗 更新时间:2023-10-29 17:31:36 25 4
gpt4 key购买 nike

给定以下类:

public class MyType
{
public static implicit operator MyType(Func<MyType> wrapper) {
return wrapper();
}
}

来自 Func<MyType> 的隐式转换至 MyType ,我假设以下是可能的:

public MyType MyTypeWrapper() {
return new MyType();
}

public void MyTestMethod() {
MyType m = MyTypeWrapper; // not a call!
}

但是我得到:

Cannot convert method group 'MyTypeWrapper' to non-delegate type 'Test.MyType'. Did you intend to invoke the method?

对我来说不幸的是,搜索时(如我预期的那样)结果为 tons of questions答案是:

Hey, ya dun goofed; toss () on the end of WhateverMethod!

现在,当我输入这段代码时,我注意到一个显式转换实际上编译了:

MyType m = (MyType) MyTypeWrapper;

为什么我不能隐式转换 Func<MyType>MyType正如我所描述的那样?

最佳答案

这很不幸。我很确定您发现了一个编译器错误,并且规范的这一部分非常难以阅读。

C# 4 规范的第 6.4.4 节解释了为什么您的隐式转换是非法的。

算法是这样的。首先看源类型和目标类型。没有源类型,因为方法组没有类型。目标类型是 MyType .所以搜索MyType用于用户定义的隐式转换。现在的问题是:从包含 S 的类型转换而来的适用的用户定义运算符集是什么S是源类型,我们已经确定没有源类型。所以这已经是转换应该失败的证据。但即使编译器出于某种原因决定你的 Func<MyType>转换适用,规则是执行标准隐式转换...方法组转换有意不归类为标准转换

所以这就是为什么它应该是非法的。

那么为什么显式转换是合法的?

没有理由这样做。这似乎是一个错误。

这很不幸;对这个错误深表歉意。我会向我以前的同事报告;如果他们的分析与我的有冲突,我会更新答案。

更新:我以前的同事告诉我,假设源表达式具有类型的规范问题将在规范的下一版本中通过重写来解决。目前还没有关于显式转换行为是否是错误的消息。

关于c# - Func<MyType> 隐式转换为 MyType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17116358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com