[英]Default non indexer properties in C#
如何在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
的默认属性实现?
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)
如果检查Nullable {T}的代码,您将看到显式强制转换实现如下:
public static explicit operator T(Nullable<T> value)
{
return &value.Value;
}
所以是的,你是对的。
Nullable<T>
的方式是通过为T
提供显式转换运算符 。
因此,也许您正在寻找类似的东西:
public static explicit operator Widget(Widgets widgets)
{
// Argument checks here.
return widgets[0];
}
这会让你做:
Widgets widgets = ..
Widget firstWidget = (Widget)widgets;
在我看来,这确实是一个非常狡猾且不直观的API,因此我不建议您这样做。 为什么不坚持使用标准索引器呢?
不太确定我是否纠正您的要求。 不足以在返回类型上实现强制转换运算符以实现您想要的吗?
如果不是您想要的,请解释。
这类功能是编译器语法糖(在IL代码中,它们都被转换为相同的低级代码),因此,基本上,如果不修改C#编译器源代码就不可能做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.