我对此问题感到困惑。传统上,如果我写一个这样的方法:
public static class MyClass
{
public static int myMethod(this int x, Func<int, bool> evaluate);
}
我会收到编译错误,说:
'ExtentionMethods.MyClass.myMethod(int,System.Func)'必须声明一个正文,因为它没有标记为abstract,extern或partial
这是可以理解的。但我查看了命名空间System.Linq下的Enumerable类。我发现所有方法都没有方法体,例如:
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
并没有任何编译错误。为什么呢?
是什么原因?
答案 0 :(得分:4)
这是因为你查看了元数据。元数据只描述接口,而不是实现。
只能在接口和抽象类中编写无主体的方法。但是如果你想使用它,你需要在派生类中实现它们。
有关抽象方法的更多信息:MSDN abstract methods 和接口:interface (C# Reference)
答案 1 :(得分:2)
我在命名空间System.Linq下看了Enumerable类,我发现所有方法都没有方法体
您没有说明您正在考虑哪种实施方式,但至少对于CoreFX而言,情况并非如此。 <!DOCTYPE hibernate-configuration SYSTEM
"classpath://hibernate-configuration-3.0.dtd">
的实施正好在System/Linq/Enumerable.cs
:
System.Linq.Enumerable.Where
在Microsoft .NET参考源中,它位于public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull(nameof(source));
}
if (predicate == null)
{
throw Error.ArgumentNull(nameof(predicate));
}
Iterator<TSource> iterator = source as Iterator<TSource>;
if (iterator != null)
{
return iterator.Where(predicate);
}
TSource[] array = source as TSource[];
if (array != null)
{
return new WhereArrayIterator<TSource>(array, predicate);
}
List<TSource> list = source as List<TSource>;
if (list != null)
{
return new WhereListIterator<TSource>(list, predicate);
}
return new WhereEnumerableIterator<TSource>(source, predicate);
}
项目的mcs/class/System.Core/System.Linq/Enumerable.cs
中:
System.Core
在Mono中,在他们切换到Microsoft的开源实现之前,实现曾经在null-conditional operator中:
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate); if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate); if (source is List<TSource>) return new WhereListIterator<TSource>((List<TSource>)source, predicate); return new WhereEnumerableIterator<TSource>(source, predicate); }
我无法找到单个.NET实现,您展示的方法是抽象的。在我能找到的所有实现中,它都是具体实现的。
答案 2 :(得分:1)
Konstantin Zadiran已经告诉过你可能正在看什么,元数据。
没有正文的方法本质上是一种抽象方法(当然,您还必须添加abstract
关键字以将其标记为一个)。只有抽象类和接口才能包含抽象方法。部分方法是没有身体的另一种方法。