根據1樓朋友doylecnn的測試,我重新進行了嘗試,發現是vs2012才有這個問題,估計是個bug,看來新東西不能亂用啊。
vs2010下正常,mac裡mono下正常。跟作業系統沒有關係。
為啥vs2012會有這個問題呢?用的也是.net 4沒有用.net 4.5。只是編譯時乙個採用vs2010乙個採用vs2012,就有不同的結果?
今天遇到個很奇怪的問題,我寫了乙個元件,要求傳入乙個action物件,於是我同事呼叫時傳入了乙個匿名函式,如下:
caller.process(()=>);
然後執行後出現異常:型別引數「tentity」與型別引數「tentity」的約束衝突。
那麼多年第一次遇到這種稀有問題,經過跟蹤除錯,發現這個問題出現的條件如下:
1.要呼叫的方法必須是乙個在父類當中的虛方法(virtual)。
2.在子類中,必須通過乙個託管函式來直接呼叫父類的base.func()虛方法,如果子類進行了覆蓋(override),然後在覆蓋中使用base.func()都沒有問題。
3.父類的這個虛方法是泛型 ,並且必須具備泛型約束,沒有約束也不會出現問題。
寫了個簡單的示例**:
1using system;
2using system.collections.generic;
3using system.linq;
4using system.text;56
namespace virtualfunction
7 16 }
1718
public
abstract
class superclass
19
2526
public
void nonvirtualfunc()
27where tentity : class
28
31 }
3233
public
class subclass : superclass
34
4243
public
void callfunc()
44 );
55 action();
5657
//另外一種託管呼叫方式,效果和上面通過action呼叫一樣
58 caller caller = () =>
59 ;
63 caller();
64 }
65 }
66 }
就上面這個問題,查詢了大量的資料,都沒有找到原因,誰能解答一下呢?
C 中建構函式和析構函式避免呼叫虛函式的問題
一 建構函式避免呼叫虛函式的問題 在建構函式中呼叫虛成員函式,雖然這是個不很常用的技術,但研究一下可以加深對虛函式機制及物件構造過程的理解。這個問題也和一般直觀上的認識有所差異。先看看下面的兩個類定義。struct c180 virtual foo struct c190 public c180 v...
C 中建構函式和析構函式避免呼叫虛函式的問題
一 建構函式避免呼叫虛函式的問題 在建構函式中呼叫虛成員函式,雖然這是個不很常用的技術,但研究一下可以加深對虛函式機制及物件構造過程的理解。這個問題也和一般直觀上的認識有所差異。先看看下面的兩個類定義。include using namespace std struct c180 virtual v...
C 中建構函式和析構函式避免呼叫虛函式的問題
gdc注 在看 c primer中文版第4版 第15.4.5小節 建構函式和析構函式中的虛函式 時,沒怎麼理解。到網上搜了搜,發現了該篇比較好的文章。該篇文章首先給出乙個例子,然後分析 的執行流程,然後我就理解了。最後,該篇文章給出了一些理論知識。值得一看。一 建構函式避免呼叫虛函式的問題 在建構函...