2011-09-24 48 views
2

如何在C#中創建默認 - 非索引器屬性?C#中的默認非索引器屬性

我的意思是我可以看到我可以創建索引器默認屬性,如this MSDN頁面上所示。

這讓我做的事情一樣

Widgets widgets = new Widgets(); 
Widget result = widgets[1]; 

但是,如果我想實現的東西像什麼Nullable<T>做什麼?

在那裏你可以

Nullable<decimal> nullDec = 1.23m; 
decimal result = nullDec.Value; 

OR

decimal result = (decimal)nullDec; 

我以爲是一個簡單的默認屬性實施nullDec.Value ???

+2

可疑的是特殊的,它們有特殊的編譯器處理。也許隱式轉換會有所幫助,但是您能否詳細說明您實際上想要做什麼? –

+0

對不起,也許我還不夠清楚。我只是想能夠創建一個類,我可以指定一個屬性,這是引用該類時返回的默認值(即:而不是去obj = myClass.Property - 我只想去obj = myClass) –

+1

@Maxim - 請注意,儘管答案顯示了您可以執行此操作的幾種方法,但此語法僅用於轉換 - *不適用於「默認屬性」 –

回答

3

Nullable<T>在編譯器中有特殊的處理,但是您可以通過添加隱式或顯式靜態轉換運算符來做的大部分

例如,對於類型Foo您可以添加操作:

public static implicit operator string(Foo value) 
{ 
    return "abc"; 
} 
public static implicit operator Foo(int value) 
{ 
    ... 
} 

允許:如果我糾正understant

Foo foo = .. 
string s = foo; // uses string(Foo value) 

int i = 123; 
Foo foo = i; // uses Foo(int value) 
1

方式Nullable<T>是否提供explicit conversion operatorT

因此,也許你正在尋找的東西,如:

public static explicit operator Widget(Widgets widgets) 
{ 
    // Argument checks here. 
    return widgets[0];  
} 

這將讓你做的事:

Widgets widgets = .. 
Widget firstWidget = (Widget)widgets; 

這看起來像一個真正狡猾的和直觀的API給我,讓我不要不建議這樣做。爲什麼不堅持標準索引器?

+0

@Downvoter:小心評論? – Ani

0

不是很確定你」再問。僅僅通過返回類型實現轉換操作符就足以實現你想要的東西了?

如果這不是你想要的,請解釋。

2

如果檢查可空的代碼橫置,你會看到顯式類型轉換的實現是這樣的:

public static explicit operator T(Nullable<T> value) 
{ 
    return &value.Value; 
} 

所以,是的,你是對的。

+0

真的有'&'那裏嗎? – 2011-09-24 08:50:44

+0

正是JustDecompile所說的。我覺得是這樣的。 – Ucodia

0

這種類型的功能是編譯器語法糖(在IL代碼中它們都被轉換爲相同的低級代碼),所以基本上不可能在不修改C#編譯器源代碼的情況下執行此操作。