40504


`List<構造体>`で扱おうとしたら、アクセシビリティに一貫性がありませんと出てしまいます。

privateにすると他からのアクセスができなくて使えないですし、internalにすると割り当てられないようでnullになってしまいます。

使い方が間違っているのでしょうか？

[code]

    struct PLAYER_DATA_BASE {
        public int ID;                 // 番号
        public new string name;        // 名前
    }
    
[/code]

を

[code]

    public class Player : MonoBehaviour {
    
[/code]

で

[code]

    public List<PLAYER_DATA_BASE> players;
    
[/code]

したいです。


CC BY-SA 3.0
2017-12-23T17:00:33.813
40502
2017-12-24T02:04:15.493
2017-12-23T17:28:39.247
19110
26759
question
c# unity3d
構造体のListが扱えない: 「アクセシビリティに一貫性がありません」


`struct
PLAYER_DATA_BASE`はアクセス修飾子が未指定ですので、既定値である`internal`扱いになります。つまりこの型は同一アセンブリ内でしか参照できません。

一方`public`型`Player`の`public`メンバーである`Player.players`はアクセス制限が全くありません。ですので任意のアセンブリの任意の型から参照することができます。

このように非パブリック型をパブリックな(`public`型の`public`/`protected`な)メンバー宣言で使用すると「アクセシビリティに一貫性がありません」というエラーになります。ちなみにこれは`private`型-`internal`メンバーの組み合わせでも発生します。

ですので`PLAYER_DATA_BASE`を`public`にするのが一番簡単な解決方法です。また`internal`で揃えても良いです。

なお`players`が割り当てられないのはアクセスレベルに関わらない仕様通りの動作ですので、どこか適当な場所で値を設定する必要があります。一番単純には

[code]

    public List<PLAYER_DATA_BASE> players = new List<PLAYER_DATA_BASE>();
    
[/code]

と初期値を設定することができます。このようなライフサイクルが要件にあっているのかは知りませんが。


CC BY-SA 3.0
2017-12-24T02:04:15.493
40504
2017-12-24T02:04:15.493
5750
40502
answer