C# Compiler : cannot access static method in a non-static context
A call to a static method will be compiled to call a specific static method on a specific class. In other words, it won't use the contents of B to determine which static method to call.
So the call has to be resolvable at compile time, hence it complains, because for all it knows, you could replace the contents of that property with multiple concrete types, which would mean that the call to the static method would have to be resolved to a static method in either of these classes.
The compiler does not have anything like a virtual or abstract static method, so for one you can't guarantee that all of those classes have that static method. And since the call has to be resolvable at compile time, it won't work like that.
You can, as you've noticed, call an instance method of the object, which in turn calls the static method. This does not invalidate the above rules since when the compiler compiles that instance method, which static method it will call is constant and known.
C# Cannot access non-static member field in static context, without actually being in static context
though I am NOT in a static context.
The initialization of instance member variables is done before the code of your constructor is executed. At this time, there is still no this
reference.
So I'm afraid your wrong. From the point of view of the compiler, you are in a static context.
From the C# specification (17.4.5.2 Instance field initialization):
A variable initializer for an instance field cannot reference the instance being created. Thus, it is a compile-time error to reference
this in a variable initializer, as it is a compile-time error for a variable initializer to reference any instance member through a simple-name.
Cannot access static method in non-static context
As per your comment I got to know that you are creating an object of CalculatorMethods
and you are trying to call methods of that class which are static using this object.
My Comment on question:
these methods are static. (and the way they are used they should be static too). But static methods cannot be accessed with object of Class but with directly Type of the class. here I m guessing CalculatorMethods is class in which methods are and you will try to do something like calc.Add() .. which will not be possible . Instead do CalculatorMethods.Add()
Instead you can try it by calling with Type directly like belwo,
void MethodOfCalling()
{
int sum = CalculatorMethods.Add(new int[2] { 1, 2 });
}
you can see, I have used CalculatorMethods
(a class name - more properly saying Type of the class) to call method not object of the class.
Cannot access non-static property, but making the field static or instantiating it brakes the code
Func<customer, string>[] _searches;
means that you declare an array of functions that return a string and receive an instance variable of type customer
but when you write
(c) => customer.city,
here you are not using the instance passed (c) but you access directly the class customer by its name and this works only for properties, methods or fields that are declared as static
Instead you just need to use the customer instance that has been passed to you at the where search(x) where x is the instance of a customer extracted by your line from x in context.customers and you receive in the Func as the variable named c
(c) => c.city,
Can a static method access and modify a non-static field in java?
The simple answer is no. You can not access a non-static field in a static method.
An alternative way around 'Cannot access non-static property in static context' using dependency property
Taking your question literally, you simply need to cast the d
parameter for the method:
private static void ReadInSource(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TagsIndicator tagsIndicator = (TagsIndicator)d;
string source = e.NewValue.ToString();
tagsIndicator.Source = source; // Error here: Cannot access non-static property 'Source' in static context
}
That would make the error go away.
BUT!
If that's all your callback is going to do, it seems like the real solution is to just delete the callback method (and of course, don't register it with the DependencyProperty
).
The whole point of the dependency property system is that WPF is managing the property values on your behalf. That callback is only called when the property has already been changed by the dependency property system, e.g. via a binding or setting the property directly itself (which, in the property setter, calls DependencyObject.SetValue()
).
Setting the property again, to the same value that it's just been set to, in response to the property having been set, does not seem to make sense to me.
Barring some specific need you haven't described in your question, you can just delete that method altogether. (And even if you do have such a need, you should ask a different question about that, because it seems likely you're going about serving that need incorrectly, given the code it led you to.)
Why can't my declared non static field be accessed inside static method?
You have 2 choices to make this work. Not sure which one applies. My guess is the first one I will show
private readonly ProcessingEndTimeData _procEndTimeData = new ProcessingEndTimeData();
change to
static private readonly ProcessingEndTimeData _procEndTimeData = new ProcessingEndTimeData();
This says that this field is also static, ie belongs to the class, not to instances of the CIMConversionHelper class.
The alternative, which I dont think you want it to create an instance of CIMConversionHelper in that method. Which as I said is probably not what you want.
If your intent is that this class (CIMConversionHelper) is all static, ie you will never create an instance of it then mark the class itself static and the compiler will ensure that you dont accidentally create non static members. ie
static class CIMConversionHelper{....}
Why is this so?
You say you have created a reference here
private readonly ProcessingEndTimeData _procEndTimeData = new ProcessingEndTimeData();
YOu have not created it yet.
You need to understand the difference between static and instance functions and fields.
Lets have an example. We have a class Thingy. It includes a factory method that makes thingy instances and keeps a count of how many it has made
public class Thingy{
static s_thingyCount = 0;
string _froop;
public static CreateThingy(){
var thing = new Thingy();
......
s_thingyCount++;
thing._froop = "hello";
return thing;
}
public void Twang(int froop){
......
}
public int Oink(string pling){
......
_froop = pling;
}
}
we can go
var t1 = Thingy.CreateThingy();
t1.Oink("Ole");
The CreateThingy does not operate on instances of the class, it operates on the class itself. The count variable does not belong to an instance, it belongs to the class itself. Note that in the create method we have to say
thing._froop = "hello";
ie which objects _froop we want to set (the one we are in the process of making).
var t1 = Thingy.CreateThingy();
now we have an instance of Thingy we can call methods on it
t1.Oink("Ole");
Look in that method
public int Oink(string pling){
......
_froop = pling;
}
we dont say which froop to set, we are manipulating an instance of the class.
We cannot do
Thingy.Oink("xxx");
Which THingy would be updates? Nor can we do
Thingy._froop = "fff";
for the same reason
but we can do
var count = Thingy.s_thingyCount;
How does this map to your class. THis method is static. It is like CreateThingy, it does not have an instance to operate on.
public static TDX2KlarfResult HandleConversion(TDXProcessItem item, string fileName)
but you do this
_procEndTimeData.ToolType = toolType;
with this field
private readonly ProcessingEndTimeData _procEndTimeData = new ProcessingEndTimeData();
this is just like doing
_froop = "hello"
in CreateThingy
_proceEndTimeData only exists in instances on your class.
It will be create when you do
new CIMConversionHelper();
But I suspect thats not what youo want to do. So you need to make _proceEndTimeData static, just like s_thingyCount
Cannot access non-static field in static context
Setting things up in the constructor would make more sense:
namespace WebApplication1
{
public partial class Team : System.Web.UI.Page
{
private readonly CommonFunctions _cf;
public string CurrentUser;
public Team()
{
_cf = new CommonFunctions();
CurrentUser = _cf.CurrentUser();
}
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(CurrentUser))
{
// Do stuff here
}
else
{
// Do other stuff here
}
}
}
}
Can static method access non-static instance variable?
A static method can access non-static methods and fields of any instance it knows of. However, it cannot access anything non-static if it doesn't know which instance to operate on.
I think you're mistaking by examples like this that don't work:
class Test {
int x;
public static doSthStatically() {
x = 0; //doesn't work!
}
}
Here the static method doesn't know which instance of Test
it should access. In contrast, if it were a non-static method it would know that x
refers to this.x
(the this
is implicit here) but this
doesn't exist in a static context.
If, however, you provide access to an instance even a static method can access x
.
Example:
class Test {
int x;
static Test globalInstance = new Test();
public static doSthStatically( Test paramInstance ) {
paramInstance.x = 0; //a specific instance to Test is passed as a parameter
globalInstance.x = 0; //globalInstance is a static reference to a specific instance of Test
Test localInstance = new Test();
localInstance.x = 0; //a specific local instance is used
}
}
Related Topics
Casting List<T> - Covariance/Contravariance Problem
Performing Inserts and Updates with Dapper
How to Tell When Httpclient Has Timed Out
Adding Headers When Using Httpclient.Getasync
Is There a Way of Setting a Property Once Only in C#
Waiting for Async/Await Inside a Task
ASP.NET 2012 Unobtrusive Validation with Jquery
Wpf: How to Loop Through the All Controls in a Window
How to Read Regex Captures in C#
Comparison of Xsd Code Generators
How to Use Interface as a C# Generic Type Constraint