给定以下类:
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!
}
然而,我得到了以下错误信息:
很不幸的是,当我搜索这个问题时(正如我所料的那样),结果出现了大量问题。答案是:无法将方法组'MyTypeWrapper'转换为非委托类型'Test.MyType'。您是否打算调用该方法?
现在,当我输入这个时,我注意到一个显式转换确实可以编译:嘿,你犯了一个错误;在
WhateverMethod
后面加上()
!
MyType m = (MyType) MyTypeWrapper;
为什么我不能像我描述的那样将
Func<MyType>
隐式转换为 MyType
?
MyType
,因为它知道这是隐式转换的唯一可能目标类型。与此情况相对比:如果您有一个从Giraffe到Fruit的显式用户定义转换,并且您将对Animal的引用显式转换为Banana类型,则编译器将搜索Animal、Banana和Fruit以查找转换运算符,但不会搜索Giraffe,因此如果用户定义的转换在Giraffe上声明,那么就没戏了。 - Eric Lippert