C# 未正确识别不同命名空间中的分部类

C# 未正确识别不同命名空间中的分部类,c#,asp.net,.net,c#-4.0,partial-classes,C#,Asp.net,.net,C# 4.0,Partial Classes,我有一个分部类,它分为两个名称空间。问题是,如果我在其中一个部分上实现了一个接口,那么在对应的部分类上就无法识别它。例如,如果被识别为ILastModified(C#fiddle at),我希望下面的结果返回true: 不能在两个不同的命名空间中使用分部类。编译器将它们视为两个不同的类 我有一个分为两个名称空间的分部 你不能。由于在不同的名称空间中,它们是不同的类 考虑到这就是名称空间存在的原因——因此不同的类可以有相同的类名 根据C#语言规范(C#4.0),§10.2,部分类型: 分部类型声明

我有一个分部类,它分为两个名称空间。问题是,如果我在其中一个部分上实现了一个接口,那么在对应的部分类上就无法识别它。例如,如果被识别为
ILastModified
(C#fiddle at),我希望下面的结果返回true:


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

我有一个分为两个名称空间的分部

你不能。由于在不同的名称空间中,它们是不同的类

考虑到这就是名称空间存在的原因——因此不同的类可以有相同的类名

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

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

(强调矿山)

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

请参阅

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

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

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


名称空间提供了类型的逻辑分离
MyNamespace.One.Product
MyNamespace.Two.Product
是两种不同的类型(如果不是这种情况,那么首先使用名称空间是没有意义的!)

因为
使用MyNamespace.One,

Main()
中:

var item=新产品()

相当于:

var item=new MyNamespace.One.Product()


将第二个
产品
类型的命名空间更改为
MyNamespace。每个类都有一个完全限定的名称,该名称由命名空间和类名组成。如果它们位于不同的命名空间中,则它们不是同一类的一部分。类的命名空间是其标识的一部分。
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; }
    }
}
var namespaces = Assembly.GetExecutingAssembly().GetTypes()
                         .Select(t => t.Namespace)
                         .Distinct();

//Returns:
//  WindowsFormsApplication2
//  WindowsFormsApplication2.Properties