8

2 つの名前空間に分割された部分クラスがあります。問題は、パーシャルの 1 つにインターフェイスを実装した場合、それが対応するパーシャル クラスで認識されないことです。たとえば、ILastModified(C# fiddle at http://ideone.com/heLDn0 )として認識されると、以下は true を返すと予想します。

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

2つの異なる名前空間に部分クラスを含めることはできません。コンパイラはそれらを2つの異なるクラスとして扱います。

于 2013-01-21T19:59:10.123 に答える
8

2 つの名前空間に分割されたパーシャルがあります。

できません。異なる名前空間にあるため、それらは異なるクラスです。

これが名前空間が存在する理由であると考えてください。したがって、異なるクラスに同じクラスを付けることができます。

C# 言語仕様 (C# 4.0)、§10.2、部分型から:

部分型宣言の各部分には、部分修飾子を含める必要があります。他の部分と同じ名前を持ち、同じ名前空間または型宣言で宣言する必要があります。

(私のものを強調)

したがって、定義上、あなたがしていることは部分型ではありません。

于 2013-01-21T20:00:53.120 に答える
2

部分クラス定義を参照してください

partial キーワードを使用すると、クラス、構造体、またはインターフェイスの他の部分を名前空間内で定義できることを示します。

これは、各クラスが名前空間を含む完全に限定された名前を持っているため、部分型は同じ名前空間内になければならないという事実によるものです。この典型的な例は、部分クラスを使用してデザイナーと UI コードが分離されている Windows フォーム アプリケーションです。私の意見では、それはまた悪いデザインを防ぎます!

これは、単純なリフレクション コードを使用して自分で確認できます (主に楽しみのため)。

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

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

名前空間は、タイプの論理的な分離を提供します。 MyNamespace.One.ProductMyNamespace.Two.Productは2つの異なるタイプです(そうでない場合は、そもそも名前空間を使用しても意味がありません!)

のためにusing MyNamespace.One;

Main()

var item = new Product();

と同等です:

var item = new MyNamespace.One.Product()

Product2番目のタイプの名前空間をに変更しますMyNamespace.One

于 2013-01-21T20:06:49.517 に答える