[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1408
  • Last Modified:

Cannot convert from ref Class to ref Object

Hello,

I have convert a VB application to C#. I am trying to debug it. I have got one error where I am calling a function proving it an instance of a class to an object as a ref.

ClassCompany clsCompany = new ClassCompany();
intCount = ModUtils.gfncintProcessTemplateLoop(ref clsCompany)


public static int gfncintProcessTemplateLoop(ref object clsRecordset)

I get the following error.

cannot convert from 'ref SiteGen.ClassCompany' to 'ref object'

gfncintProcessTemplateLoop is a generic function and is used to pass different classes and is the reason why the class is delcares as an object.

I also tried casting clsCompany into an Object.
intCount = ModUtils.gfncintProcessTemplateLoop(ref (object)clsCompany)
Then I got another error saying
A ref or out argument must be an lvalue

Can anybody help me with this one please.

Thank you
TV


0
Tpvv
Asked:
Tpvv
  • 7
  • 4
  • 2
  • +2
1 Solution
 
aprestoCommented:
Can you not change this:

public static int gfncintProcessTemplateLoop(ref ClassCompany clsRecordset)

to this:

public static int gfncintProcessTemplateLoop(ref object clsRecordset)

its barfing because of the combination of ref and object (i think )

will the method expect different types of objects?
0
 
TpvvAuthor Commented:
Hello,

Thank you very much for your comment.
No I cannot change
public static int gfncintProcessTemplateLoop(ref object clsRecordset)

to

public static int gfncintProcessTemplateLoop(ref ClassCompany clsRecordset)

as the same function is used by other objects as well to do various things.

Regards
TV
0
 
aprestoCommented:
ok can you change this:

ClassCompany clsCompany = new ClassCompany();

to this then:

object clsCompany = new ClassCompany();
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
TpvvAuthor Commented:
If I do that I cannot acces any of the Properties or methods inside ClassCompany.
0
 
Carl TawnSystems and Integration DeveloperCommented:
Is your static method designed to work with value types ? If not, then you don't need "ref" at all because classes are reference types and get passed by reference already.
0
 
TpvvAuthor Commented:
The static method accepts both value types and reference types as parameters and works with both. If I remove the ref, then the error goes away. However whether it will provide me with the same result I am not sure.

The properties and methods within the passed object is called multiple times in gfncintProcessTemplateLoop to do various things.

I am not able to test it as I am still in the process of debugging the code and it will take a while before I will be able to do some test on it.
0
 
Carl TawnSystems and Integration DeveloperCommented:
You said you can't use:

    object clsCompany = new ClassCompany();

Because you won't be able to access the type-specific methods and properties. Are you intending to access its type-specific methods from inside gfncingProcessTemplateLoop() ?
0
 
TpvvAuthor Commented:
Yes gfncingProcessTemplateLoop() also accesses type specific methods of the object that was passed. The code does a casting into the specific type to access the members.
This is my next problem as even though the casting is done, none of the properties and methods can be accessed from the passed object in gfncingProcessTemplateLoop()
0
 
Bob LearnedCommented:
Would this work:

intCount = ModUtils.gfncintProcessTemplateLoop(ref clsCompany.ToObject())

Bob
0
 
TpvvAuthor Commented:
No I tired that. It does not work

Regards
MTV
0
 
mjmarlowCommented:
try:

object refobject = clsCompany as Object();
intCount = ModUtils.gfncintProcessTemplateLoop(ref refobject);

0
 
mjmarlowCommented:
change:
object refobject = clsCompany as Object;
intCount = ModUtils.gfncintProcessTemplateLoop(ref refobject);
0
 
TpvvAuthor Commented:
Yes it works.
Great!!! Thanks for that.

There is one more issue that I have related to the same static method.
After I pass clsCompany as an object to gfncintProcessTemplateLoop, I am casting it back to its original type depending on the type. Then I am accessing the properties and methods within the object.

However this throws an error in spite of casting it back to its original type.

clsRecordset = ((ClassCompany) clsRecordset);
if (clsRecordset.RecordCount != 0)

This gives an error saying that Object does not contain a definition for RecordCount.

Any idea what should be done here?

Thank you
MTV
0
 
mjmarlowCommented:
change:
clsRecordset = ((ClassCompany) clsRecordset);
to:
ClassCompany myClassCompany = clsRecordset as ClassCompany;
if( myClassCompany.RecordCount!=0)....


0
 
mjmarlowCommented:
BTW,
When you use the "as" operator, it will return null if the object can not be cast into the type.  So safer usage is:

ClassCompany myClassCompany = clsRecordSet as ClassCompany;

if(myClassCompany!=null) // is clsRecordSet really a "ClassCompany"?
{


}
0
 
TpvvAuthor Commented:
That is great!!

Thank you. It works.

Regards
MTV
0

Featured Post

Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

  • 7
  • 4
  • 2
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now