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