2015-07-12 79 views
0

我有這個類:當我使用對象引用時,我想訪問它的一個屬性(作爲默認屬性)。可能嗎?

public class NodeData<T> 
    { 
     public string Name; 
     public T Value; 
     public NodeData(string name, T value){ 
      this.Name = name; 
      this.Value = value; 
     } 
    } 
    NodeData data = new NodeData<int>("test",111); 

這怎麼可能訪問使用的data代替data.Value

我的意思var a = data;此對象的值應該是int 111不是NODEDATA對象。可能嗎?因此,使用我的對象要簡單得多。

+0

名稱和值是該類的對象的屬性。數據是對類的對象的引用。當您調用data.value時,您將獲得對象的屬性值。可能通過數據獲取值,但不能通過該類來獲取值。 – Reisclef

+0

您可以通過以下方法覆蓋NodeData類的ToString()方法:return Value.ToString()。當然,T類型應該有重寫方法ToString,如果它是你自定義類型(類,結構...)不是基本類型(int,string ...) – hazjack

+0

@Reisclef我明白了,但我期待對於默認屬性或類似的東西,如果這樣的事情存在! –

回答

2

裏面的類,你可以有一個運營商:

public static implicit operator T(NodeData<T> data) 
{ 
    return data.Value; 
} 

用法:

var data = new NodeData<int>("test", 111); 
int a = data; // OK 

它不會與vara申報工作。


現在我在你編輯之前閱讀你的問題。如之前

void WriteLine(object o); 
void WriteLine(int i); 

然後用data,呼叫::假設一個方法被重載這樣

WriteLine(data) 

將得到解決如下(簡化):第一個過載是適用通過自簡單引用轉換NodeData<>派生自object。第二次過載也適用於您的用戶定義的implicit轉換運算符。由於兩種超載都適用,我們需要嘗試找到兩者中的「更好」的一個。 int版本更好,因爲int可隱式轉換爲object(通過裝箱轉換),而object未隱式轉換爲int(並非所有對象均爲整數)。

所以最後,int過載是在綁定時選擇的。

+0

感謝您的出色答案。但我也有另一個問題。 'data1 + data2'運行得比'data1.Value + data2.Value'慢嗎? –

+1

@ a.toraby我的猜測是,不,它會以相同的速度運行。我假設你在Release模式下構建了應用程序(啓用了優化),並在未連接Visual Studio Debugger的情況下運行它。在這種情況下,我相信對運營商的調用(這只是運行時的一種普通方法)將會[內聯](https://en.wikipedia.org/wiki/Inline_expansion)。正如我所說,我認爲在我提到的條件下,速度將是一樣的。 –

相關問題