2012-05-05 26 views
0

我有這樣一類和委託在C#:重寫這一行C++/CLI

public delegate void Super(); 
public class Event 
{ 
    public event Super activate ; 
    public void act() 
    { 
     if (activate != null) 
      activate(); 
    } 
} 

我需要重寫在C++/CLI。但我有一個錯誤 - usage requires Event::activate to be data member

public delegate void Super(); 
public ref class Event 
{ 
    public: 
     event Super ^activate; 
     void act() 
     { 
      if (activate!=nullptr) 
       activate(); 
     } 
}; 

難道是activate()調用的問題?

+1

它是不高興,因爲'如果(激活= nullptr!)'特別是'activate'不是數據值 –

+0

所以如何在C++/cli中做與c#中相同的事情? –

回答

3

IIRC,在C++/CLI中你不需要null測試,編譯器會爲你插入它。只需撥打

activate(); 

MSDN證實了這一點:

下面的代碼示例演示了用於生成瑣碎事件的提高方法的邏輯:如果事件有一個或多個用戶,調用raise方法隱式或顯式調用委託。如果委託人的退貨類型不是void,並且零事件訂戶的raise方法返回委託類型的默認值。 如果沒有事件訂閱者,則簡單地返回raise方法並且不會引發異常。如果委託返回類型不是void,則返回委託類型。

這是一件非常好的事情,因爲C#鼓勵競爭條件(您發佈的代碼有一個)。 C++/CLI編譯器不會重新讀取空檢查和調用之間的支持字段,因此它是線程安全的,無需額外的工作。正確的C#版本,這等同於C++/CLI編譯器生成的東西,是:

var activate_copy = activate; 
if (activate_copy != null) 
    activate_copy();