gpt4 book ai didi

c# - 扩展方法和编译时检查

转载 作者:太空狗 更新时间:2023-10-29 23:11:08 26 4
gpt4 key购买 nike

也许有点棘手,但我想知道为什么。在 System.Core.dllSystem.Linq.Enumerable.cs 中,我们有:

public static int Count<TSource>(this IEnumerable<TSource> source);

在我的代码中我做了一些坏事:

namespace Test
{
public static class Extensions
{
public static int Count<TSource>(this IEnumerable<TSource> source)
{
return -1; //evil code
}
}

//commented temporarily
//public static class CommentedExtensions
//{
// public static int Count<TSource>(this IEnumerable<TSource> source)
// {
// return -2; //another evil code
// }
//}

public static void Main(string[] args)
{
Console.WriteLine(Enumerable.Range(0,10).Count()); // -1, evil code works
Console.Read();
}
}

如果我取消注释 CommentedExtensions,我将收到一个编译错误,如预期的那样显示“此调用不明确 blabla”。但是为什么我没有在第一时间得到这个错误呢?也很暧昧!

EDIT 经过另一次测试,我发现如果扩展方法在不同的命名空间,即使它们完全相同,我也不会得到编译错误。为什么允许?它在c#中带来了模棱两可的方法调用。

EDIT2 我知道实际上这两个 Count 在 IL 中是不同的。实际上它在调用

Enumerable.Count(Enumerable.Range(0,10))

我邪恶的扩展方法正在调用:

MyExtension.Count(Enumerable.Range(0,10))

所以他们是不同的。但我仍然认为这是一种难闻的气味。我们有“真正的”扩展方法吗?哪些可以防止不良行为?

最佳答案

C# language specification 的第 7.6.5.2 节描述编译器如何确定哪些扩展方法在范围内,以及哪些扩展方法优先于其他方法:

The search for C [(a candidate extension method)] proceeds as follows:

  • Starting with the closest enclosing namespace declaration, continuing with each enclosing namespace declaration, and ending with the containing compilation unit, successive attempts are made to find a candidate set of extension methods:
    • If the given namespace or compilation unit directly contains non-generic type declarations Ci with eligible extension methods Mj, then the set of those extension methods is the candidate set
    • If namespaces imported by using namespace directives in the given namespace or compilation unit directly contain non-generic type declarations Ci with eligible extension methods Mj, then the set of those extension methods is the candidate set.

这意味着如果您在与调用它们的代码相同的命名空间中拥有扩展方法,则会选择这些扩展方法。将选择封闭命名空间中的扩展方法,而不是已导入的其他命名空间。

关于c# - 扩展方法和编译时检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com