メンバー '<method>'はインスタンス参照でアクセスできません


195

私はC#に入り、この問題が発生しています:

namespace MyDataLayer
{
    namespace Section1
    {
        public class MyClass
        {
            public class MyItem
            {
                public static string Property1{ get; set; }
            }
            public static MyItem GetItem()
            {
                MyItem theItem = new MyItem();
                theItem.Property1 = "MyValue";
                return theItem;
            }
        }
     }
 }

私はUserControlにこのコードを持っています:

using MyDataLayer.Section1;

public class MyClass
{
    protected void MyMethod
    {
        MyClass.MyItem oItem = new MyClass.MyItem();
        oItem = MyClass.GetItem();
        someLiteral.Text = oItem.Property1;
    }
}

にアクセスする場合を除いて、すべてが正常に機能しますProperty1。インテリセンスは私だけ「を与えるEqualsGetHashCodeGetType、およびToString」オプションとして。にカーソルを合わせるとoItem.Property1、Visual Studioから次のような説明が得られます。

MemberMyDataLayer.Section1.MyClass.MyItem.Property1.getcannot be accessed with an instance reference, qualify it with a type name instead

私はこれが何を意味するのかわからない、私はグーグルをやったがそれを理解することができなかった。

回答:


283

C#では、VB.NETやJavaとは異なりstatic、インスタンス構文ではメンバーにアクセスできません。やったほうがいい:

MyClass.MyItem.Property1

そのプロパティを参照するか、static修飾子を削除しますProperty1(これはおそらく実行したいことです)。概念についてstaticは、他の回答を参照してください


45

タイプの名前を使用して静的メンバーにのみアクセスできます。

したがって、次のいずれかを書く必要があります。

MyClass.MyItem.Property1

または(これはおそらくあなたがする必要があることです)、その定義からキーワードをProperty1削除してインスタンスプロパティを作成しますstatic

静的プロパティはクラスのすべてのインスタンス間で共有されるため、値は1つだけです。現在の定義では、MyItemクラスのインスタンスを作成しても意味がありません。


これは、「または(これはおそらくあなたがする必要があることです)、定義からstaticキーワードを削除して、Property1をインスタンスプロパティにします。」成功の鍵です!! ありがとう
tim687 2014年

29

私は同じ問題を抱えていました-数年後ですが、いくつかのポインタが役立つかもしれません:

不必要に「静的」を使用しないでください!

実行時とコンパイル時の両方のセマンティクス(動作)と構文の観点から「静的」が何を意味するかを理解します。

  • 静的エンティティは
    、初めて使用する前に自動的に構築されます。

  • 静的エンティティには1つのストレージロケーションが割り当てられており、
    そのエンティティにアクセスするすべてのユーザーが共有します。

  • 静的エンティティには、その型
    のインスタンスではなく、その型名を介してのみアクセスできます。

  • 静的メソッドには、インスタンスメソッドのように暗黙の「this」引数はありません。(したがって、静的メソッドは実行
    オーバーヘッドが少ない–それらを使用する理由の1つです。)

  • 静的エンティティを使用する場合は、スレッドセーフについて検討してください。

MSDNの静的に関する詳細:


4

完全に説明されているように、この場合はstaticを使用する必要はありません。GetItem()以下の両方の例のように、メソッドなしでプロパティを初期化することもできます。

namespace MyNamespace
{
    using System;

    public class MyType
    {
        public string MyProperty { get; set; } = new string();
        public static string MyStatic { get; set; } = "I'm static";
    }
}

消費する:

using MyType;

public class Somewhere 
{
    public void Consuming(){

        // through instance of your type
        var myObject = new MyType(); 
        var alpha = myObject.MyProperty;

        // through your type 
        var beta = MyType.MyStatic;
    }
}       

3

インスタンス参照ではアクセスできません

これは、STATICメソッドを呼び出してインスタンスに渡すことを意味します。最も簡単な解決策は、Staticを削除することです。例:

public static void ExportToExcel(IEnumerable data、string sheetName){


2

私はこれが古いスレッドであることを知っていますが、私の問題が何であるかを理解するために3時間費やしました。私は通常、このエラーの意味を知っていますが、より微妙な方法でこれに遭遇することもあります。私の問題は、クライアントクラス(インスタンスクラスから静的メソッドを呼び出すクラス)に異なる型のプロパティがありましたが、静的メソッドと同じ名前でした。コンパイラによって報告されたエラーはここで報告されたものと同じでしたが、問題は基本的に名前の衝突でした。

このエラーが発生し、上記のいずれも解決しない場合は、名前空間名でインスタンスクラスを完全に修飾してみてください。..()コンパイラーは、正確な名前を確認できます。


これは役に立ちました。名前の衝突があり、それを知らなかった。メソッドを呼び出す前に名前空間を追加するとすぐに、問題は解決しました。
最大

1

コードに、ほとんどの部分が静的クラス名と一致する名前空間が含まれているかどうかを確認します。

名前空間Fooで定義され、メソッドJumpまたはプロパティを実装する静的なBarクラスを考えると、Barで終わる別の名前空間もあるため、コンパイラエラーが発生している可能性があります。うん、魚のようなもの;-)

その場合は、使用バーを使用することを意味しますそして、Bar.Jump()呼び出し、したがって、次のソリューションの1つがニーズに合うはずです。

  • Foo.Bar.Jump()宣言の結果となるnamepaceを使用して静的クラス名を完全修飾します。また、Using Barを削除する必要があります。ステートメント
  • 名前空間バーの名前を別の名前に変更します。

私の場合、Database.SetInitializer()呼び出しのEFEntity Framework)リポジトリプロジェクトで次のコンパイラエラーが発生しました。

Member 'Database.SetInitializer<MyDatabaseContext>(IDatabaseInitializer<MyDatabaseContext>)' cannot be accessed with an instance reference; qualify it with a type name instead MyProject.ORM

MyProject.ORMを追加すると、このエラーが発生しますお気づきかもしれませんが、データベースの名前空間は、接尾辞(Database)がDatabase .SetInitializerクラス名と一致します。

これでは、EFのデータベース静的クラスを制御できず、カスタム名前空間も保持したいので、次のコマンドを使用した結果、namepace System.Data.EntityでEFのデータベース静的クラスを完全に修飾することにしました。コンパイル成功:

System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy)

それが役に立てば幸い


1

私は(重複)質問を通じて、C#コンパイラエラーCS0176のためにグーグルでここに来た静的メンバーインスタンス参照の問題

私の場合、同じ名前の静的メソッドと拡張メソッドがあるため、エラーが発生しました。これについては、同じ名前の静的メソッドと拡張メソッドを参照してください。

[これはコメントであるべきだったのかもしれません。まだ評判が足りなくて申し訳ありません。]


1

これによりエラーが発生します。

MyClass aCoolObj = new MyClass();
aCoolObj.MyCoolStaticMethod();

これは修正です:

MyClass.MyCoolStaticMethod();

説明:

オブジェクトのインスタンスから静的メソッドを呼び出すことはできません。静的メソッドの要点は、オブジェクトのインスタンスに関連付けられるのではなく、そのオブジェクトのすべてのインスタンスを通じて永続化すること、および/またはオブジェクトのインスタンスなしで使用されることです。


0
YourClassName.YourStaticFieldName

静的フィールドの場合、次のようになります。

public class StaticExample 
{
   public static double Pi = 3.14;
}

別のクラスから、次のように静的フィールドにアクセスできます。

    class Program
    {
     static void Main(string[] args)
     {
         double radius = 6;
         double areaOfCircle = 0;

         areaOfCircle = StaticExample.Pi * radius * radius;
         Console.WriteLine("Area = "+areaOfCircle);

         Console.ReadKey();
     }
  }

おそらく、ソリューションを質問の例に変換し、静的フィールドがクラス定義とインスタンスに関してどのように機能するかについて少し説明できますか?
noetix

コメントありがとうございます、今は@Alexはどうですか?
Hedego
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.