Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 扩展方法返回InvalidCastException_C#_Exception_Exception Handling_Extension Methods - Fatal编程技术网

C# 扩展方法返回InvalidCastException

C# 扩展方法返回InvalidCastException,c#,exception,exception-handling,extension-methods,C#,Exception,Exception Handling,Extension Methods,我正在努力学习如何使用扩展方法,并创建了自己的扩展方法。现在我尝试运行我的代码,但Visual Studio给了我一个错误,我有一个未处理的InvalidCastException,所以我处理了它并尝试运行它 我必须在catch块中返回null,所以我还有另一个未处理的异常,并将其打印出来 现在,当我尝试运行这段代码时,输出是 InvalidCastException 空引用异常 通过向强制转换添加(动态)尝试了此处找到的解决方案,结果相同 注意,我有java背景,不是C# 使用系统; 使用Sy

我正在努力学习如何使用扩展方法,并创建了自己的扩展方法。现在我尝试运行我的代码,但Visual Studio给了我一个错误,我有一个未处理的InvalidCastException,所以我处理了它并尝试运行它

我必须在catch块中返回null,所以我还有另一个未处理的异常,并将其打印出来

现在,当我尝试运行这段代码时,输出是

InvalidCastException
空引用异常

通过向强制转换添加(动态)尝试了此处找到的解决方案,结果相同

注意,我有java背景,不是C#

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序4
{
班级计划
{
静态void Main(字符串[]参数)
{
气味r=新气味();
IEnumerable selectie=r.TakeRange(101000);
尝试
{
foreach(选择中的int i)
{
WriteLine(“selectie:{0}”,i);
}
}
捕获(NullReferenceException)
{
Console.WriteLine(“NullReferenceException”);
}
Console.ReadLine();
}
}
静态类MyExtension
{
公共静态气味范围(此气味为r,整数开始,整数结束)
{
尝试
{
返回(气味)r.Where(i=>i>start&&i
您应该更改以下行
return(Reeks)r.Where(i=>i>start&&i
return(Reeks)(r.Where(i=>i>start&&i


where子句返回应转换为列表的枚举数。此外,您还可以尝试在linq中使用
跳过
获取
来替换上述代码段。

您正在
try
块中铸造
Where
调用的返回值,以键入
Reeks

return (Reeks)r.Where(i => i > start && i < end);
return(Reeks)r.Where(i=>i>start&&i
但是,在任何地方都没有名为
Where
的方法实际返回类型为
Reeks
的对象。该代码调用
Enumerable.Where
,它返回某种
IEnumerable
实现,但肯定不是您自己的类型


您必须实现一个名为
Where
的新方法(扩展或实例),该方法可以在
Reeks
对象上调用,还可以返回
Reeks
对象。或者,您可以简单地接受这样一个事实,即
Where
不返回
Reeks
,而只希望返回
IEnumerable

您应该更改静态方法,使其返回
IEnumerable
,请查看以下内容:

static class MyReeksExtension {
        public static IEnumerable <int> TakeRange(this IEnumerable<int> r, int start, int end) {
            return r.Where(i => i > start && i < end);
        }
    }
静态类MyReeksExtension{
公共静态IEnumerable TakeRange(此IEnumerable r,int start,int end){
返回r.Where(i=>i>start&&i
确保您的“selectie”也属于此类型:

IEnumerable<int> selectie = r.TakeRange(10, 1000);

        foreach (int n in selectie)
            Console.Write("{0}; ", n);
IEnumerable selectie=r.TakeRange(101000);
foreach(选择中的int n)
Write(“{0};”,n);

没问题,我也得找人帮忙:在哪一行?调试代码了吗?在两个try主体上,从
return(Reeks)r.Where(i=>i>start&&i气味的类型。其中
不再是气味
Reeks
IEnumerable
但每个
IEnumerable
都不是
Reeks
。正如现在定义的那样,
Reeks
是一个生成硬编码列表的类。它不是用来保存自定义数据的。你能解释一下这个类的意图吗?对于你的java知道的思想:考虑一个扩展方法,它是在第一个代码>指定的类中声明的一个“魔术自定义实例方法”。对于
Where
方法,这是
IEnumerable
。查找扩展方法的签名,您将看到它还返回
IEnumerable
,而不保证更具体的类型。(除了两个
T
显然是相同的以外)无法将列表转换为Reeks@Ivaro18,似乎您有一个无限循环,请检查代码。这根本不起作用。因为这个问题完全错了。两个
IEnumerable
不一样,但是Reek实现了IEnumerable,这难道不能解决这个问题吗?否则我将重写其中的Java,
ArrayList
也是一个
列表
,但您仍然无法将其强制转换到
链接列表
,因为它们实现了相同的接口。
IEnumerable<int> selectie = r.TakeRange(10, 1000);

        foreach (int n in selectie)
            Console.Write("{0}; ", n);