不能正确识别不同命名空间中的部分类

时间:2013-01-21 19:58:13

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

我有一个部分分为两个名称空间。问题是,如果我在其中一个部分上实现了接口,则在对应的部分类中无法识别它。例如,我希望下面的内容返回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; }
    }
}

4 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:7)

  

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

你做不到。通过在不同的名称空间中,它们是不同的类。

请注意,这就是名称空间存在的原因 - 因此您可以为不同的类使用相同的类名称

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

  

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

(强调我的)

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

答案 2 :(得分:2)

请参阅Partial Class Definitions

  

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

这是因为部分类型必须位于同一名称空间内,因为每个类都有一个完全量化的名称,其中包含名称空间。一个主要的例子是Windows Forms Application,设计器和UI代码使用分部类分开。在我看来,这也可以防止糟糕的设计!

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

var namespaces = Assembly.GetExecutingAssembly().GetTypes()
                         .Select(t => t.Namespace)
                         .Distinct();

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

答案 3 :(得分:1)

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

由于using MyNamespace.One;

Main()

var item = new Product();

相当于:

var item = new MyNamespace.One.Product()

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