【问题标题】:C# generic indexer wont return a stringC# 通用索引器不会返回字符串
【发布时间】:2014-07-10 20:45:50
【问题描述】:

这是带有通用索引器的类

 public class IndexThis<T>
{
    T[] MainArr = new T[100];

    public IndexThis(params T[] Arrz)
    {
        for (int i = 0; i < Arrz.Length; i++)
        {
            MainArr[i] = Arrz[i];
        }
    }

    public T this[int index]
    {
        get
        {
            if (MainArr[index] == null) return "myStringHere";  //compile error
            return MainArr[index]; 
        }

        private set { }
    }
}

尝试将其强制转换为 (T) 或使用“as T”仍然会给我编译时错误,看来我真的不记得我在这里错过了什么

【问题讨论】:

  • 无法保证将string 转换为T

标签: c# generics return indexer


【解决方案1】:

T,因为它目前不受约束,可以是任何东西。索引器需要返回 T 并且调用代码需要一个 T 类型的实例。

假设您使用类型...

var foo = new IndexThis<Giraffe>();

您的索引器现在基本上是:

public Giraffe this[int index]
{
    get
    {
        if (MainArr[index] == null) return "myStringHere";  //compile error
        return MainArr[index]; 
    }
}

这当然没有意义。

如果需要返回值,请考虑返回default( T )。或者,抛出异常。

【讨论】:

  • 好吧,既然我已经觉得自己够笨了,我会继续问你,按照我的实际想法,最好的方法是什么,而不是使用 T 作为返回类型,将其更改为对象会成功的吗?或者可能最好的方法是在 if 语句之后调用一个方法,该语句在控制台上写入假定的字符串?
  • 没有必要感到愚蠢。最好的方法取决于你想要做什么。如果您只需要诊断信息,请抛出异常或记录值(控制台很好),无论是否有效。是的,您可以返回一个对象,但是调用者会如何处理该信息?他们需要检查您返回的值的类型以做任何有用的事情。
  • 本来可以作为一个对象工作,因为我只是为了学习目的而在 console.writeline 上调用索引器。还是谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2020-08-24
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多