我有一个部分分为两个名称空间。问题是,如果我在其中一个部分上实现了接口,则在对应的部分类中无法识别它。例如,我希望下面的内容返回true,因为被识别为ILastModified(http://ideone.com/heLDn0处的C#小提琴):
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; }
}
}
答案 0 :(得分:19)
你不能在两个名称空间中有一个部分类。编译器将它们视为两个不同的类。
答案 1 :(得分:7)
我有一个部分分为两个名称空间。
你做不到。通过在不同的名称空间中,它们是不同的类。
请注意,这就是名称空间存在的原因 - 因此您可以为不同的类使用相同的类名称。
来自C#语言规范(C#4.0),§10.2,部分类型:
部分类型声明的每个部分都必须包含部分修饰符。它必须具有相同的名称,并在与其他部分相同的名称空间或类型声明中声明。
(强调我的)
因此,根据定义,您所做的不是部分类型。
答案 2 :(得分:2)
使用partial关键字表示可以在 命名空间中定义类,结构或接口的其他部分。
这是因为部分类型必须位于同一名称空间内,因为每个类都有一个完全量化的名称,其中包含名称空间。一个主要的例子是Windows Forms Application,设计器和UI代码使用分部类分开。在我看来,这也可以防止糟糕的设计!
您可以使用简单的反射代码自己看到这一点(主要是为了好玩)。
var namespaces = Assembly.GetExecutingAssembly().GetTypes()
.Select(t => t.Namespace)
.Distinct();
//Returns:
// WindowsFormsApplication2
// WindowsFormsApplication2.Properties
答案 3 :(得分:1)
命名空间提供类型的逻辑分隔。 MyNamespace.One.Product
和MyNamespace.Two.Product
是两种不同的类型(如果不是这种情况,那么首先使用命名空间是没有意义的!)
由于using MyNamespace.One;
,
在Main()
:
var item = new Product();
相当于:
var item = new MyNamespace.One.Product()
将第二个Product
类型的命名空间更改为MyNamespace.One