当前位置:  开发笔记 > 编程语言 > 正文

为什么不能在.NET中定义通用索引器?

如何解决《为什么不能在.NET中定义通用索引器?》经验,为你挑选了4个好方法。

为什么不能在.NET中创建通用索引器?

以下代码抛出编译器错误:

   public T this[string key]
   {
      get { /* Return generic type T. */ }
   }

这是否意味着您无法为通用成员集合创建通用索引器?



1> Sam Harwell..:

这是一个有用的地方.假设你有一个强类型OptionKey的声明选项.

public static class DefaultOptions
{
    public static OptionKey SomeBooleanOption { get; }
    public static OptionKey SomeIntegerOption { get; }
}

通过IOptions界面公开选项的位置:

public interface IOptions
{
    /* since options have a default value that can be returned if nothing's
     * been set for the key, it'd be nice to use the property instead of the
     * pair of methods.
     */
    T this[OptionKey key]
    {
        get;
        set;
    }

    T GetOptionValue(OptionKey key);
    void SetOptionValue(OptionKey key, T value);
}

然后,代码可以使用通用索引器作为一个很好的强类型选项存储:

void Foo()
{
    IOptions o = ...;
    o[DefaultOptions.SomeBooleanOption] = true;
    int integerValue = o[DefaultOptions.SomeIntegerOption];
}



2> Kev..:

属性在C#2.0/3.0中不能通用,因此您不能拥有通用索引器.


你有这方面的任何东西的链接吗?我在"新功能"文档中看不到它.
mmmm ......我想我找到了你要找的链接.http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=352188对我来说似乎不可思议的是,微软表示它不是一个有用的功能,但已经实现了一些解决方法扩展器(ieDataRowExtender)
2016年,c#6没有通用索引器.https://github.com/dotnet/roslyn/issues/523

3> davogones..:

我不知道为什么,但索引器只是语法糖.写一个通用的方法,你将获得相同的功能.例如:

   public T GetItem(string key)
   {
      /* Return generic type T. */
   }



4> Greg Beech..:

您可以; 只需从声明中删除该部分,它就可以正常工作.即

public T this[string key]
{
   get { /* Return generic type T. */ }
}

(假设您的类是通用的,名为类型参数T).


除非您在类级别定义,否则这将无效.
@Igor - 这就是为什么我说"假设你的类是通用的名为T的类型参数".问题并没有表明类型参数应该与容器不同(在任何情况下,这都是一个非常不寻常的设计!).
@Greg ......它有多不寻常?以DataRow中的Field <>泛型方法为例.他们所做的是通过泛型方法取消装箱,因为通过通用索引器是不可能的.
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有