2013-03-28 86 views
2

EnumerablePointEnumerator<T>.GetCurrent(ref Point p)Microsoft.Research.DynamicDataDisplay.DataSources)我发现了一个错误Unable to cast object of type '<XYPairsInRange>d__8' to type 'IXYPair'.无法投射型“<XYPairsInRange> d__8”为类型“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语句并没有成功返回一个列表(无产量)

编辑:XValues和YValues都列出<双>

调用代码:

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

什么是XValues'的'类型? – 2013-03-28 09:56:28

+0

显示您的调用代码,请 – Nathan 2013-03-28 09:57:48

回答

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; 
} 
+0

谢谢!修复它 – cguest 2013-03-28 11:15:26

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

+0

谢谢,我也尝试了自己的代码,它工作正常,我的问题似乎与DynamicDataDisplay.DataSources EnumerablePointEnumerator .GetCurrent(ref Point p)。你知道为什么我会得到一个方法名称作为一种类型吗? – cguest 2013-03-28 10:42:07

+0

问题出在'Query'方法中,请参阅我的答案。 – 2013-03-28 10:57:01

相关问题