Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 从集合继承并实现可枚举接口时,IEnumerable扩展方法(System.Linq)不可用_C#_Linq_Ienumerable_Linq Extensions - Fatal编程技术网

C# 从集合继承并实现可枚举接口时,IEnumerable扩展方法(System.Linq)不可用

C# 从集合继承并实现可枚举接口时,IEnumerable扩展方法(System.Linq)不可用,c#,linq,ienumerable,linq-extensions,C#,Linq,Ienumerable,Linq Extensions,问题 如果我有一个定义如下的类: public class TestList : ObservableCollection<TestClass>, IList<ITestInterface>, ICollection<ITestInterface>, IEnumerable<ITestInterface>, IEnumerable 背景 对于那些好奇的人,我在使用Telerik RadGridView控件WPF时遇到了这个问题。我试图在网格的Co

问题 如果我有一个定义如下的类:

public class TestList : ObservableCollection<TestClass>, IList<ITestInterface>, ICollection<ITestInterface>, IEnumerable<ITestInterface>, IEnumerable
背景
对于那些好奇的人,我在使用Telerik RadGridView控件WPF时遇到了这个问题。我试图在网格的Columns属性上使用.First扩展方法,但Columns属性的类型具有类似于我上面提供的类定义。

原因是编译器没有足够的类型信息来明确推断泛型第一个方法的类型参数。在您的案例中,可能的类型参数是TestClass和ITestInterface

可以通过显式指定类型参数来帮助编译器。将汇编以下文件:

var item1 = t.First<TestClass>();
var item2 = t.First<ITestInterface>();

是的,编译器本可以产生更好的错误消息。

原因是编译器没有足够的类型信息来明确推断泛型第一个方法的类型参数。在您的案例中,可能的类型参数是TestClass和ITestInterface

可以通过显式指定类型参数来帮助编译器。将汇编以下文件:

var item1 = t.First<TestClass>();
var item2 = t.First<ITestInterface>();
是的,编译器本可以产生更好的错误消息。

首先:请不要这样做。您已经在同一类型上实现了IEnumerable和IEnumerable,这可能会导致一些非常严重的问题

例如:IEnumerable是协变的,所以如果将类型转换为IEnumerable,会发生什么?对象序列是否仅包含TestClass对象,或者是否可以包含实现ITestInterface的任何对象?很难说!有关这一点的详细讨论,请参阅我2007年关于这一主题的文章的评论:

正如另一个答案所指出的,您所处的特别糟糕的情况是,重载解析的类型推断步骤无法推断第一个的类型参数应该是什么,因为有两个不兼容的选项。较小的复制将是:

public class C : IEnumerable<string>, IEnumerable<object>
{
    IEnumerator<string> IEnumerable<string>.GetEnumerator() => null;
    IEnumerator<object> IEnumerable<object>.GetEnumerator() => null;
    IEnumerator IEnumerable.GetEnumerator() => null;
} 
现在新的C.首先给出了同样的错误

错误信息很可怕,对此我深表歉意。常见的情况是没有这种适用的扩展方法,错误消息针对这种情况进行了优化。最好检测出没有适用扩展方法的原因是由于类型推断失败。在其他错误报告场景中,我这样做了,但这次没有

考虑在GitHub上报告一个问题,也许这个问题可以得到解决。

首先:请不要这样做。您已经在同一类型上实现了IEnumerable和IEnumerable,这可能会导致一些非常严重的问题

例如:IEnumerable是协变的,所以如果将类型转换为IEnumerable,会发生什么?对象序列是否仅包含TestClass对象,或者是否可以包含实现ITestInterface的任何对象?很难说!有关这一点的详细讨论,请参阅我2007年关于这一主题的文章的评论:

正如另一个答案所指出的,您所处的特别糟糕的情况是,重载解析的类型推断步骤无法推断第一个的类型参数应该是什么,因为有两个不兼容的选项。较小的复制将是:

public class C : IEnumerable<string>, IEnumerable<object>
{
    IEnumerator<string> IEnumerable<string>.GetEnumerator() => null;
    IEnumerator<object> IEnumerable<object>.GetEnumerator() => null;
    IEnumerator IEnumerable.GetEnumerator() => null;
} 
现在新的C.首先给出了同样的错误

错误信息很可怕,对此我深表歉意。该扩展没有适用于该消息的公共情况。最好检测出没有适用扩展方法的原因是由于类型推断失败。在其他错误报告场景中,我这样做了,但这次没有


考虑在GitHub上报告一个问题,也许这个问题可以得到解决。

好吧,这很令人困惑。我可能只会依赖您的继承和.Cast中非泛型的IEnumerable部分来将其恢复到一个LINQable状态。好吧,这相当混乱。我可能只会依赖继承和.Cast的非泛型IEnumerable部分将其恢复到LINQable状态。哇,我真傻,竟然不尝试指定类型。我想我只是被智能感知中没有出现的方法甩了。谢谢哇,我连指定类型都不尝试,真是太傻了。我想我只是被智能感知中没有出现的方法甩了。谢谢谢谢你的信息!这样做有什么好处吗?即使收益不超过成本?正如我在文章底部提到的,我在一个第三方库中偶然发现了这一点,所以我很好奇它是这样构建的。@Alex:你得问问库作者。一个可能的因素是,可能在我们将协方差添加到C4之前就设计了该类型,并且他们有一个场景,在同一个对象中支持两种不同类型的序列。感谢您提供的信息!有什么可以得到的吗
我在做这个?即使收益不超过成本?正如我在文章底部提到的,我在一个第三方库中偶然发现了这一点,所以我很好奇它是这样构建的。@Alex:你得问问库作者。一个可能的因素是,可能在我们将协方差添加到C4之前就设计了这个类型,并且它们有一个场景,在同一个对象中支持两种不同类型的序列。