gpt4 book ai didi

c# - 为什么这个类引用没有歧义?

转载 作者:行者123 更新时间:2023-12-04 15:02:05 27 4
gpt4 key购买 nike

我想知道为什么这种情况不会导致类型之间的引用不明确,一种是我们库中的类,另一种是外部结构。考虑以下 -

外部结构-

namespace External.Models
{
public struct ProxyUser
{
public string Username { get; set; }
public string Password { get; set; }
}
}

我们类-

namespace MyApp.Configuration
{
public class ProxyUser
{
public string Username { get; set; }
public string Password { get; set; }
}
}

然后调用代码近似-

using External.Models;

namespace MyApp.Configuration.Factories
{
sealed class Factory
{
public async Task<T> BuildConfiguration<T>()
{
var proxy = new ProxyUser { Username = username, Password = password }; // I would expect this to be ambiguous, but it references out class
}
}
}

如果有所不同,这是一个 NetStandard 2.0 库。如果我把我们的类(class)变成一个结构,行为是一样的。为什么这不是模棱两可的?

编辑 - 类是密封的,如果这有区别的话......

回答

正如@Sinatr 提到的,它似乎与这个问题有关- https://stackoverflow.com/a/25437586/14872099

这是我观察到的不同行为的演示。

这解析为我们的 MyApp.Configuration.ProxyUser-

using External.Models;

namespace MyApp.Configuration.Factories
{
sealed class Factory
{
public async Task<T> BuildConfiguration<T>()
{
var proxy = new ProxyUser { Username = username, Password = password }; // resolves to our class
}
}
}

这解析为外部结构-

namespace MyApp.Configuration.Factories
{
using External.Models;

sealed class Factory
{
public async Task<T> BuildConfiguration<T>()
{
var proxy = new ProxyUser { Username = username, Password = password }; // resolves to external struct
}
}
}

将我们的类移动到另一个命名空间会产生歧义-

using External.Models;
using MyApp.Configuration.Models; // moved our class to this namespace

namespace MyApp.Configuration.Factories
{
sealed class Factory
{
public async Task<T> BuildConfiguration<T>()
{
var proxy = new ProxyUser { Username = username, Password = password }; // this is ambiguous
}
}
}

最佳答案

内部命名空间(即在 namespace 括号内)优先于外部命名空间(即在 namespace block 之前的 using 语句)。

注意:“内部”和“外部”在这里不是官方定义,我只是用它们来轻松区分它们。

由于嵌套,您的 namespace MyApp.Configuration.Factories block 本身也会查看任何直接祖先(MyApp.ConfigurationMyApp) ,但不是兄弟 namespace (例如 MyApp.Configuration.Services)。

当在内部命名空间中发现非歧义引用时,系统从不检查外部命名空间,因此不会发现冲突。只有在以下情况下才会遇到冲突:

  • 内部命名空间中有两个有效选项,例如MyApp.Configuration.ProxyUserMyApp.Configuration.Factories.ProxyUser
  • 引用的外部命名空间中有两个有效选项,例如External.Models.ProxyUserAnother.Namespace.ProxyUser(假设两者都在该文件中用 using 语句引用)

关于c# - 为什么这个类引用没有歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66799662/

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