微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么这个类引用没有歧义?

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

外部结构-

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 库。如果我将我们的类设为结构体,行为是相同的。为什么这不模棱两可?

EDIT - 类是密封的,如果这会有所不同的话...

答案

正如@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 括号内)优先于外部命名空间(即 using 块之前的 namespace 语句)。

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

由于嵌套,您的 namespace MyApp.Configuration.Factories 块本质上也查看任何直接祖先(MyApp.ConfigurationMyApp),但不查看同级命名空间(例如 MyApp.Configuration.Services)。>

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。