Свойства неиндексатора по умолчанию в C # - PullRequest
2 голосов
/ 24 сентября 2011

Как вы можете создать свойство по умолчанию - не индексатор - в C #?

Что я имею в виду, так это то, что я вижу, что могу создавать свойства индексатора по умолчанию, как показано на этом MSDN стр.

Это позволяет мне делать такие вещи, как

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

Но что, если я хочу достичь чего-то вроде того, что делает Nullable<T>?

Где вы можете взять

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

ИЛИ

decimal result = (decimal)nullDec;

Я предполагаю, что это просто реализация свойства по умолчанию для nullDec.Value ???

Ответы [ 5 ]

3 голосов
/ 24 сентября 2011

Nullable<T> имеет специальную обработку в компиляторе, но вы можете сделать большинство этого, добавив неявные или явные статические операторы преобразования.

Например, для типа Foo вы можете добавить оператор:

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

позволяет:

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

и

int i = 123;
Foo foo = i; // uses Foo(int value)
2 голосов
/ 24 сентября 2011

Если вы посмотрите код Nullable {T}, вы увидите, что явная реализация приведена так:

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

Так что да, вы правы.

1 голос
/ 24 сентября 2011

Способ Nullable<T> делает это путем предоставления оператора явного преобразования в T.

Так что, возможно, вы ищете что-то вроде:

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

, который позволил бы вам сделать:

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

Это действительно похоже на действительно Хитрый и неинтуитивный API для меня, поэтому я не рекомендую делать это вообще.Почему бы просто не придерживаться стандартных индексаторов?

0 голосов
/ 24 сентября 2011

Такие функции являются синтаксическим сахаром компилятора (в коде IL все они преобразуются в один и тот же низкоуровневый код), поэтому в принципе это невозможно сделать без изменения исходного кода компилятора C #.

0 голосов
/ 24 сентября 2011

Не совсем уверен, правильно ли я исправлю то, что вы просите.Разве не достаточно реализовать операторы приведения возвращаемого типа для достижения того, что вы хотите?

Если это не то, что вы намереваетесь, объясните, пожалуйста.

...