繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM