關於帶泛型約束的虛函式在託管函式中的呼叫問題

2022-01-16 04:34:49 字數 1367 閱讀 5950

根據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小節 建構函式和析構函式中的虛函式 時,沒怎麼理解。到網上搜了搜,發現了該篇比較好的文章。該篇文章首先給出乙個例子,然後分析 的執行流程,然後我就理解了。最後,該篇文章給出了一些理論知識。值得一看。一 建構函式避免呼叫虛函式的問題 在建構函...