Метод расширения возвращает InvalidCastException
Я пытаюсь научиться использовать методы расширения и создал свои собственные. Теперь я попытался запустить свой код, но Visual Studio выдал ошибку, что у меня возникла необработанная исключительная ситуация InvalidCastException, поэтому я обработал ее и попытался запустить.
Мне пришлось вернуть null в блоке catch, поэтому у меня было еще одно необработанное исключение, которое также было напечатано.
Теперь, когда я пытаюсь запустить этот код, я вывод
InvalidCastException
NullReferenceException
Универсальный метод преобразования throw InvalidCastException Попробовал решение, найденное здесь, добавив (динамический) к приведению, тот же результат.
Обратите внимание, у меня есть Java-фон, а не C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Reeks r = new Reeks();
IEnumerable<int> selectie = r.TakeRange(10, 1000);
try
{
foreach (int i in selectie)
{
Console.WriteLine("selectie: {0}", i);
}
}
catch (NullReferenceException)
{
Console.WriteLine("NullReferenceException");
}
Console.ReadLine();
}
}
static class MyExtension
{
public static Reeks TakeRange(this Reeks r, int start, int end)
{
try
{
return (Reeks)r.Where(i => i > start && i < end);
}
catch (InvalidCastException) {
Console.WriteLine("InvalidCast"); return null;
}
}
}
public class Reeks : IEnumerable<int>
{
public Reeks()
{
}
public IEnumerator<int> GetEnumerator()
{
int start = 2;
yield return start;
for (; ; )
{
int nieuw = start * 2;
yield return nieuw;
start = nieuw;
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
}
3 ответа
Вы должны изменить свой статический метод, чтобы он возвращал IEnumerable <int>
, Взгляни на это:
static class MyReeksExtension {
public static IEnumerable <int> TakeRange(this IEnumerable<int> r, int start, int end) {
return r.Where(i => i > start && i < end);
}
}
Убедитесь, что ваш 'selectie' также относится к этому типу:
IEnumerable<int> selectie = r.TakeRange(10, 1000);
foreach (int n in selectie)
Console.Write("{0}; ", n);
Нет проблем, мне тоже пришлось искать помощь:P
Вы применяете возвращаемое значение Where
позвонить в try
блок для ввода Reeks
:
return (Reeks)r.Where(i => i > start && i < end);
Тем не менее, нигде нет метода, вызываемого Where
который на самом деле возвращает объект типа Reeks
, Этот код вызывает Enumerable.Where
, который возвращает какой-то IEnumerable
реализация, но определенно не ваш собственный тип.
Вы должны либо реализовать новый (расширение или экземпляр) метод с именем Where
это можно назвать на Reeks
объект, а также возвращает Reeks
объект. Или вы могли бы просто принять тот факт, что Where
не возвращает Reeks
и просто ожидать IEnumerable<int>
вместо.
Вы должны изменить следующую строку return (Reeks)r.Where(i => i > start && i < end);
в return (Reeks)(r.Where(i => i > start && i < end).ToList().AsEnumerable());
Предложение where возвращает перечислитель, который должен быть преобразован в список. Кроме того, вы можете попробовать skip
а также take
в linq для замены к фрагменту кода выше.