如何在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
???
答案 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#编译器源就不可能做到这一点。