protected internal parameter *less* accessible than protected internal method? [duplicate] - c#

This question already has answers here:
Inconsistent accessibility with protected internal member
(1 answer)
Inconsistent Accessibility: Parameter type is less accessible than method
(13 answers)
What is the difference between 'protected' and 'protected internal'?
(12 answers)
What are the default access modifiers in C#?
(10 answers)
Is there an easy way to use InternalsVisibleToAttribute?
(4 answers)
Closed 2 years ago.
I have the following code in C# (.Net)
public class A
{
protected internal enum Color {WHITE, BLACK};
}
public class B
{
protected internal int methodOne(A.Color color)
{
if (color == A.Color.WHITE)
return 1;
return 2;
}
}
But I'm getting the following error: error CS0051: Inconsistent accessibility: parameter type 'A.Color' is less accessible than method 'B.methodOne(A.Color)'
Why does it say the parameter is "less accessible" when both the parameter type and the method have the same access modifier (protected internal)?
Update #1: this is what I really want to achieve:
public class A
{
internal enum Color {WHITE, BLACK};
}
public class B
{
protected int methodOne(A.Color color)
{
if (color == A.Color.WHITE)
return 1;
return 2;
}
}
public class C : B
{
int methodTwo()
{
return methodOne(A.Color.WHITE);
}
}
I want to keep enum Color as internal, and I want methodOne to be accessible only by derived classes. Is this possible?

Related

How to dynamically create a generic type object instance knowing its Type definition? [duplicate]

This question already has answers here:
How to dynamically create generic C# object using reflection? [duplicate]
(5 answers)
How to create a new object instance from a Type
(11 answers)
Closed 2 years ago.
I am developing a C# application. I have this kind of generic method with a type parameter:
public abstract class StuffDoer
{
public abstract void DoStuff();
}
public class MyStuffDoer : StuffDoer
{
public override void DoStuff()
{
/* We do stuff here */
}
}
/* ... */
public void CreateAndDoStuff<T>() where T: StuffDoer, new()
{
T instance = new T();
instance.DoStuff();
}
public void MyCreateAndDoStuff()
{
CreateAndDoStuff<MyStuffDoer>();
}
However, I'd like to pass the type parameter in the actual method parameters so the type could be decided dynamically. In other words, I'd like to do something like this (example is not valid C# but should illustrate the point):
public void CreateAndDoStuff(Type t) where t: StuffDoer, new()
{
t instance = new t();
instance.DoStuff();
}
public void MyCreateAndDoStuff()
{
CreateAndDoStuff(typeof(MyStuffDoer));
}
Is this kind of thing somehow possible in C#?

Inconsistent accessibility: return type [duplicate]

This question already has answers here:
Error 1 Inconsistent accessibility: return type is less accessible than method
(4 answers)
Closed 2 years ago.
I have an public interface:
public interface IDataService
{
Task<List<Data>> GetAll(string type);
}
And a DataService class that implements it:
public class DataService : IDataService
{
public async Task<List<Data>> GetAll(string type)
{
}
}
Now I get the error:
Inconsistent accessibility: return type 'Task<List<Data>>' is less accessible than method 'DataService.GetAll(string)'
What is wrong with this implementation? Everything is public imho.
Data class needs to be public. You cannot use less visibility level since the return type of the public method is needed to be public.

What access modifier to use [duplicate]

This question already has answers here:
In C#, what is the difference between public, private, protected, and having no access modifier?
(19 answers)
Closed 6 years ago.
Suppose I have a base class:
public class A {
public float someValue;
<Access Modifier Here> float SomeValue {
get {
return someValue;
}
}
}
And I want to derive from it:
public class B : A {
public float SomeProperty {
get {
return SomeValue;
}
}
}
What access modifier would I use if I want to make the SomeValue property only available to the deriving class and not anywhere else?
for only derived classes.. use protected
Protected means that access is limited to the containing class or types derived from the containing class.

C# OOP of inheritance and polymorphism [duplicate]

This question already has answers here:
C# Inconsistent accessibility error
(2 answers)
Closed 9 years ago.
I get a warning in my program that is
'Employee.Salaried.CalculatePay()' hides inherited member 'Employee.Employee.CalculatePay()'. Use the new keyword if hiding was intended.
for this
public double CalculatePay()
{
return ((AnnualSalary * (ManagementLevel * BONUS_PERCENT)) + AnnualSalary) / 52;
}
Anyone have suggestions on how to get rid of there warning?
public double CalculatePay()
{
return annualSalary / 52;
}
public double CalculatePay(double modifiedSalary)
{
AnnualSalary = modifiedSalary;
return AnnualSalary / 52;
}
To avoid this you would have to change the code to something like
public class A
{
public virtual void TADA()
{
}
}
public class B : A
{
public override void TADA()
{
}
}
Have a look at
virtual (C# Reference)
The virtual keyword is used to modify a method, property, indexer, or
event declaration and allow for it to be overridden in a derived
class.
When a virtual method is invoked, the run-time type of the object is
checked for an overriding member. The overriding member in the most
derived class is called, which might be the original member, if no
derived class has overridden the member.
By default, methods are non-virtual. You cannot override a non-virtual
method.
override (C# Reference)
The override modifier is required to extend or modify the abstract or
virtual implementation of an inherited method, property, indexer, or
event.
seems the parent class (or the parent of it) already has a same function CalculatePay(), so if you want to overwrite it, just declare your function as override:
public override double CalculatePay()
{
return ((AnnualSalary * (ManagementLevel * BONUS_PERCENT)) + AnnualSalary) / 52;
}
You are hiding the CalculatePay() function of your base class. If this is what you are looking to do, use the new modifier to change your code to:
new public double CalculatePay()
{
return ((AnnualSalary * (ManagementLevel * BONUS_PERCENT)) + AnnualSalary) / 52;
}
http://msdn.microsoft.com/en-us/library/aa691135(v=vs.71).aspx

C# Overloaded method invocation with Inheritance [duplicate]

This question already has answers here:
Different behaviour of method overloading in C#
(3 answers)
Closed 9 years ago.
I wonder what is the reason for the invocation of the method that prints "double in derived". I didn't find any clue for it in the C# specification.
public class A
{
public virtual void Print(int x)
{
Console.WriteLine("int in base");
}
}
public class B : A
{
public override void Print(int x)
{
Console.WriteLine("int in derived");
}
public void Print(double x)
{
Console.WriteLine("double in derived");
}
}
B bb = new B();
bb.Print(2);
Straight from the C# spec (7.5.3 Overload resolution):
the set of candidates for a method invocation does not include methods marked override (§7.4), and methods in a base class are not candidates if any method in a derived class is applicable (§7.6.5.1).
In your example, the overriden Print(int x) is not a candidate and Print(double x) is applicable, so it is picked without a need to consider the methods in the base class.
The compiler looks at methods which are freshly-declared in the most derived class (based on the compile-time type of the expression) and sees if any are applicable. If they are, it uses the "best" one available.
See the answer to this question :
Different behaviour of method overloading in C#

Categories

Resources