web-dev-qa-db-ja.com

異なる名前空間の部分クラス

異なる名前空間に部分クラスを作成できますか?正しく動作しますか?例:

class1.cs

namespace name1
{
    public partial class Foo
    {
        Bar1(){
            return 10;
        }
    }
}

class2.cs

namespace name1.name2
{
    public partial class Foo
    {
        Bar2(){
            return 100;
        }
    }
}

main.cs

using name1;
using name1.name2;

namespace mainClass
{
    public class mainClass
    {
        Foo classFoo = new Foo();
        int Count = classFoo.Bar1() + classFoo.Bar2();
        // Will Count = 110?
    }
}

動作させるにはどうすればよいですか? (私の例が正しくない場合)

57
RAMe0

クラスの名前には名前空間が含まれているため、name1.Fooおよびname1.name2.Fooは2つの完全に独立したタイプです。あなたの質問に対する短い答えは:いいえ。

なぜこのようなことをする必要があるのですか?

86
CodingGorilla

部分クラスは同じ名前空間と同じアセンブリでのみ可能です。

名前空間は2つの異なるアセンブリに存在できますが、部分クラスは存在できません。

26
Abdul Saboor

部分クラスを実装する際に考慮すべき点がいくつかあります:-

  • 部分クラスの各部分で部分キーワードを使用します。

  • 部分クラスの各部分の名前は同じである必要がありますが、部分クラスの各部分のソースファイル名は異なっていてもかまいません。

  • 部分クラスのすべての部分は同じ名前空間にある必要があります。

  • 部分クラスの各部分は同じアセンブリまたはDLLにある必要があります。つまり、異なるクラスライブラリプロジェクトのソースファイルに部分クラスを作成することはできません。

  • 部分クラスの各部分には同じアクセシビリティがあります。 (プライベート、パブリック、保護など)

  • 部分クラスのクラスまたはインターフェイスを継承すると、部分クラスのすべての部分で継承されます。

  • 部分クラスの一部が封印されると、クラス全体が封印されます。

  • 部分クラスの一部が抽象クラスの場合、クラス全体が抽象クラスと見なされます。

11
Farhan S.

これは機能しません。コンパイラは、Foo classFoo = new Foo();行にあいまいな名前エラーを表示します。部分クラスが機能するためには、名前空間は実際には型の完全修飾名の一部であるため、それらは同じ名前空間に存在する必要があります。

7

また、静的クラスの場合、新しいC#6.0の助けを借りてこのようなものを実装できます 静的機能を使用

考慮してください:

namespace SomeLogic1
{
    public static class Util
    {
        public static int Bar1()
        {
            return 1;
        }
    }
}

namespace SomeLogic2
{
    public static class Util
    {
        public static int Bar2()
        {
            return 2;
        }
    }
}

namespace GeneralStuff
{
    using SomeLogic1;
    using SomeLogic2;

    public class MainClass
    {
        public MainClass()
        {
            // Error CS0104
            // 'Util' is an ambiguous reference between 'SomeLogic1.Util' and 'SomeLogic2.Util'
            var result = Util.Bar1() + Util.Bar2(); 
        }
    }
}  

コンパイルできません。エラーメッセージは明らかです。状況を修正するために、名前空間を直接指定できます(ただし、私が理解している限り、これは望ましくありません)。

namespace GeneralStuff
{
    public class MainClass
    {
        public MainClass()
        {
            var result = SomeLogic1.Util.Bar1() + SomeLogic2.Util.Bar2(); 
        }
    }
}

[〜#〜]または[〜#〜]適用できる静的を使用この方法で機能:

namespace GeneralStuff
{
    using static SomeLogic1.Util;
    using static SomeLogic2.Util;

    public class MainClass
    {
        public MainClass()
        {
            var result = Bar1() + Bar2(); 
        }
    }
}

おそらく、いくつかのヘルパー/ utilsクラスに対してこれを行うことは問題ありません。しかし、他の人が気づいたように、部分クラスは方法ではありません。

3
psfinaki

MSDNの部分的なクラスおよびメソッドの制限 https://msdn.Microsoft.com/en-us/library/wa80x488.aspx

2
Sandeep