8

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

4 回答 4

20

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

于 2013-01-21T19:59:10.123 回答
8

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

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

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

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

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

(强调我的)

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

于 2013-01-21T20:00:53.120 回答
2

请参阅部分类定义

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

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

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

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

//Returns:
//  WindowsFormsApplication2
//  WindowsFormsApplication2.Properties
于 2013-01-21T20:04:03.127 回答
1

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

因为using MyNamespace.One;

Main()

var item = new Product();

相当于:

var item = new MyNamespace.One.Product()

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

于 2013-01-21T20:06:49.517 回答