[英]Implicit cast of Func<MyType> to MyType
鑒於以下課程:
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
?
這很不幸。 我很確定你發現了編譯器錯誤,而且規范的這一部分非常難以閱讀。
C#4規范的第6.4.4節解釋了為什么隱式轉換是非法的。
算法是這樣的。 首先看一下源類型和目標類型。 沒有源類型,因為方法組沒有類型。 目標類型是MyType
。 因此,搜索MyType
以獲取用戶定義的隱式轉換。 現在的問題是:什么是適用的用戶定義的運算符集...從包含S的類型轉換 ? S
是源類型,我們已經確定沒有源類型 。 所以這已經證明轉換失敗了。 但即使編譯器出於某種原因決定您的Func<MyType>
轉換適用,該規則也是標准的隱式轉換.... 方法組轉換有意不歸類為標准轉換 。
所以這就是為什么它應該是非法的。
為什么顯性演員合法?
沒有理由這樣做。 這似乎是一個錯誤。
這很不幸; 許多道歉的錯誤。 我會向以前的同事報告; 如果他們的分析與我的相沖突,我會更新答案。
更新:我以前的同事告訴我,源表達式假定具有類型的規范問題將通過規范的下一版本中的重新措辭來解決。 還沒有關於顯式演員行為是否是一個錯誤的消息。
您已經在使用從方法組到Func<MyType>
的內置隱式轉換。
編譯器不會一次執行兩次隱式轉換。
一旦對類進行了顯式轉換,編譯器就會知道對任何可以顯式轉換為類的類型進行隱式轉換。
因為C#編譯器無法將MyTypeWrapper
轉換為Func<MyType>(MyTypeWrapper)
。 方法組和實際委托之間存在差異。
這編譯並運行良好:
MyType m = new Func<MyType>(MyTypeWrapper);
存在從方法組到與該組匹配的委托類型的隱式轉換,並且存在用戶定義的從該委托到類型的隱式轉換。 這里的一般想法是編譯器一次只能在一行中使用一個隱式轉換。 當它有A並需要C時,它會查找從A到C的轉換,而不是從A到任何類型B以及從該類型到C的轉換。該算法從O(n)變為O(n ^ 2)(不是提到可能對程序員來說很困惑)。
使用顯式MyType
轉換為MyType
時代碼的工作原因是您不再鏈接隱式轉換。
MyTestMethod
的簽名MyTestMethod
Func<MyType>
的簽名,但不是Func<MyType>
。 Func已經定義了一些隱式轉換本身,允許您將這些方法指定為Funcs,但是您必須顯式轉換為要應用的簽名,因為編譯器不會為您鏈接隱式轉換:
MyType m = (Func<MyType>)MyTypeWrapper; // not a call!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.