4

列挙型VSプロパティ名の競合について、これこれ、およびこの質問があります。

私の質問は命名規則についてではなく、代わりに以下のコードで示されている名前の競合を解決する方法を知りたいです。

namespace Test
{
    public class Person
    {
        // 1)
        // Gender? Gender { get; set; }

        // 2)
        Gender Gender { get; set; }

        public Person ()
        {
            // 1 - Error CS1061: Type `Test.Gender?' does not contain a definition for `Male' and no extension method `Male' of type `Test.Gender?' could be found (are you missing a using directive or an assembly reference?) (CS1061) (Test)
            // 2 - OK
            Gender = Gender.Male;
        }
    }

    public enum Gender
    {
        Male = 1,
        Female
    }
}

2)のようにプロパティを宣言するとGender Gender { get; set; }、コードは正常にコンパイルされますが、1)のように宣言するとGender? Gender { get; set; }(上記のコードでコメントされています)、エラーが発生します

Error CS1061: Type `Test.Gender?' does not contain a definition for `Male' and no extension method `Male' of type `Test.Gender?' could be found (are you missing a using directive or an assembly reference?) (CS1061) (Test)

なぜそれが起こるのですか?

4

2 に答える 2

7

Gender?つまりNullable<Gender>、これは、コンパイラが、インスタンスでGender.Male呼び出されたプロパティで getter を呼び出そうとしていると判断することを意味します。つまり、プロパティの読み取りとして解釈され、その結果に基づいて呼び出されたプロパティの読み取りとして解釈されます。MaleNullable<Gender>Genderthis.GenderMaleMale

列挙型はメソッドを持つことができないため、コンパイラはケース (2) をエラーとして識別しません。そのため、意味のある唯一の解決策は、列挙型自体です。

これは、名前修飾を増やすことで修正できます。

namespace Acme.Fruits.Banana
{
    ...
    public Person()
    {
        Gender = Banana.Gender.Male
    }
    ...
}
于 2013-01-17T18:58:14.737 に答える