C#中的默认非索引器属性

时间:2011-09-24 08:43:24

标签: c# properties language-features nullable default-value

如何在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 ???

的默认属性实现

5 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:2)

如果你检查Nullable {T}的代码,你会发现显式的强制转换实现是这样的:

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

所以是的,你是对的。

答案 2 :(得分:1)

Nullable<T>的方式是向T提供public static explicit operator Widget(Widgets widgets) { // Argument checks here. return widgets[0]; }

所以也许你正在寻找类似的东西:

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

可以让你这样做:

{{1}}

这对我来说看起来像真的狡猾且不直观的API,所以我不建议这样做。为什么不坚持使用标准索引器?

答案 3 :(得分:0)

不确定我是否正确理解你的要求。是不是足以在返回类型上实现强制转换操作符来实现你想要的?

如果不是您想要的,请解释。

答案 4 :(得分:0)

这类功能是编译器语法糖(在IL代码中它们都被转换为相同的低级代码),所以基本上如果不修改C#编译器源就不可能做到这一点。