2

EnumerablePointEnumerator<T>.GetCurrent(ref Point p)( Microsoft.Research.DynamicDataDisplay.DataSources) 我得到一个错误Unable to cast object of type '<XYPairsInRange>d__8' to type 'IXYPair'.

XYPairsInRange 不是类型,而是我的类的方法,返回类型为 IEnumerable

public IEnumerable<IXYPair> XYPairsInRange(double startX, double endX)
{
   foreach (IXYPair pair in this.XYPairs)
   {
      if (pair.X >= startX && pair.X <= endX)
      {
         yield return pair;
      }
   }
}

public IEnumerable<IXYPair> XYPairs
{
   get
   {
       int counter = 0;
       foreach (double x in XValues)
       {
          yield return new XYPair() { X = x, Y = YValues[counter++] };
       }
   }
}

IXYPair 定义为

public interface IXYPair
{
    double X { get; }
    double Y { get; }
}

什么可能在运行时导致此错误?我已经尝试显式地转换 yield return 语句并返回一个列表(没有 yield)但没有成功

编辑: XValues 和 YValues 都是 List< double >

调用代码:

public IEnumerable Query()
    {
        yield return this.Data.XYPairsInRange(Double.NegativeInfinity, Double.PositiveInfinity);
    }
4

2 回答 2

0

我试过你的代码,它似乎没有任何问题:

public interface IXYPair {
    double X { get; }
    double Y { get; }
}

class XYPair : IXYPair {
    public double X { get; set; }
    public double Y { get; set; }

    public override string ToString( ) {
        return string.Format( "X = {0} ; Y = {1}", X, Y );
    }
}

class Program {
    static List<double> XValues;
    static List<double> YValues;

    static void Main( string[ ] args ) {
        XValues = new List<double>( ) { 0.05, 0.25, 0.85, 0.95, 0.35, 1.65, 115.25 };
        YValues = new List<double>( ) { 0.25, 0.85, 1.15, 12.95, 7.35, 1.75, 0.13 };

        foreach ( IXYPair pair in XYPairsInRange( 0.5, 1.5 ) )
            Console.WriteLine( pair.ToString() );
    }

    public static IEnumerable<IXYPair> XYPairsInRange( double startX, double endX ) {
        foreach ( IXYPair pair in XYPairs ) {
            if ( pair.X >= startX && pair.X <= endX ) {
                yield return pair;
            }
        }
    }

    public static IEnumerable<IXYPair> XYPairs {
        get {
            int counter = 0;
            foreach ( double x in XValues ) {
                yield return new XYPair( ) { X = x, Y = YValues[ counter++ ] };
            }
        }
    }
}

结果:

X = 0.85 ; Y = 1.15
X = 0.95;Y = 12.95

于 2013-03-28T10:22:07.737 回答
0

问题是您从Query()方法中产生了一个枚举器,而不是来自枚举器的项目:

这:

public IEnumerable Query()
{
    yield return this.Data.XYPairsInRange(Double.NegativeInfinity, Double.PositiveInfinity);
}

可以改写如下:

public IEnumerable<IEnumerable<IXYPair>> Query()

现在你应该知道为什么这不起作用了。

您应该将方法的主体重写为:

public IEnumerable<IXYPair> Query()
{
    return this.Data.XYPairsInRange(...);
}

或对此(以上是首选):

public IEnumerable<IXYPair> Query()
{
    foreach (var pair in this.Data.XYPairsInRange(...))
        yield return pair;
}
于 2013-03-28T10:55:28.720 回答