【问题标题】:Partial classes in different namespace are not being recognized correctly无法正确识别不同命名空间中的部分类
【发布时间】:2013-01-21 19:58:13
【问题描述】:

我有一个分为两个命名空间的部分类。问题是,如果我在其中一个部分上实现了接口,则在对应的部分类上无法识别它。例如,我希望以下内容返回 true 以被识别为 ILastModified(C# fiddle at http://ideone.com/heLDn0):

using System;
using MyNamespace.One;
 
public class Test
{
    public static void Main()
    {
        var item = new Product();
        Console.WriteLine(item is ILastModified); //RETURNS FALSE??!
    }
}
 
interface ILastModified
{
    DateTime LastModified { get; set; }
}
 
namespace MyNamespace.One
{
    public partial class Product
    {
        public int ID { get; set; }
    }
}
 
namespace MyNamespace.Two
{
    public partial class Product : ILastModified
    {
        public DateTime LastModified { get; set; }
    }
}

【问题讨论】:

  • 如果它们在不同的命名空间中,那么它们就不是同一个类的一部分。类的命名空间是其身份的一部分。

标签: c# asp.net .net c#-4.0 partial-classes


【解决方案1】:

您不能在两个不同的命名空间中拥有分部类。编译器将它们视为两个不同的类。

【讨论】:

  • 每个类都有一个完全限定名,由命名空间和类名组成。
【解决方案2】:

我有一个分割成两个命名空间的部分。

你不能。通过在不同的命名空间中,它们是不同的类。

考虑到这就是命名空间存在的原因 - 因此您可以为不同的类使用相同的类name

来自 C# 语言规范 (C# 4.0),§10.2,部分类型:

部分类型声明的每个部分都必须包含一个部分修饰符。它必须与其他部分具有相同的名称并在相同的命名空间或类型声明中声明。

(强调我的)

因此,根据定义,您所做的不是部分类型。

【讨论】:

    【解决方案3】:

    Partial Class Definitions

    使用 partial 关键字表示类、结构或接口的其他部分可以在 命名空间中定义。

    这是因为部分类型必须在同一个命名空间中,因为每个类都有一个包含命名空间的完全量化的名称。一个典型的例子是使用 Windows 窗体应用程序,设计器和 UI 代码使用部分类分开。在我看来,它还可以防止糟糕的设计!

    您可以使用简单的反射代码亲眼看到这一点(主要是为了好玩)。

    var namespaces = Assembly.GetExecutingAssembly().GetTypes()
                             .Select(t => t.Namespace)
                             .Distinct();
    
    //Returns:
    //  WindowsFormsApplication2
    //  WindowsFormsApplication2.Properties
    

    【讨论】:

      【解决方案4】:

      命名空间提供类型的逻辑分离。 MyNamespace.One.ProductMyNamespace.Two.Product 是两种不同的类型(如果不是这种情况,那么一开始就没有命名空间!)

      因为using MyNamespace.One;

      Main():

      var item = new Product();

      相当于:

      var item = new MyNamespace.One.Product()

      将第二个Product类型的命名空间改为MyNamespace.One

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 2011-05-29
        • 2012-05-07
        • 2011-10-05
        • 2019-12-19
        • 2015-09-17
        • 2015-05-31
        相关资源
        最近更新 更多