Cry about...
MS-Windows Troubleshooting
Property, indexer, or event 'XYZ' is not supported by the language; try directly calling accessor method ...
Symptom:
When trying to compile C# code which uses a library written in VB.Net the following compiler error is generated:
Property, indexer, or event 'SomeName' is not supported by the language; try directly calling accessor method 'SomeNamespace.SomeClass.get_SomeName(...)
where "SomeName" is the name of a property that you are using in the C# code, "SomeClass" is the name of the class which contains that property and "SomeNamespace" is the namespace which contains the class.
The property (or function) in VB.Net is defined with one or more optional parameters.
For example, calling the following VB.Net property:
Public Readonly Property NextLine(Optional ByVal consume as
Boolean = False) as String
Get
NextLine = m_nextLine
if (consume) then MoveNext
End Get
End
Property
from the following C#:
string line = input.NextLine;
will cause the following error to be generated:
Property, indexer, or event 'NextLine' is not supported by the language; try directly calling accessor method 'ExampleNamespace.ExampleClass.get_NextLine(bool)
Cause
VB.Net allows functions and properties to be defined which take optional parameters, but C# does not support this. (Although I understand that C# 4.0 will support them.) Because C# does not support optional parameters the compiler generates this error.
Possible Remedies
- The error can be avoided by calling the accessor property directly
and with all the arguments explicitly provided.
For example, modify the C# shown above to:
string line = input.get_NextLine(false);
- Alternatively, rewrite the VB.Net property to remove the
optional argument. Functionality roughly equivalent to that provided
by optional arguments can be achieved using overloads, where a
different overloaded function is provided for each combination of
arguments.
For example, rewriting the VB.Net show above to:
Public Overloads Readonly Property NextLine(ByVal consume as Boolean = False) as String
Get
NextLine = m_nextLine
if (consume) then MoveNext
End Get
End Property
Public Readonly Property NextLine() as String
Get
NextLine = m_nextLine
End Get
End propertyThis way you can still call the "NextLine" property from C# without arguments, but you will still need to call the version with arguments via the "accessor" method (above).
These notes have been tested within Microsoft Visual Studio .NET 2008, and may apply to other versions as well.
About the author: Brian Cryer is a dedicated software developer and webmaster. For his day job he develops websites and desktop applications as well as providing IT services. He moonlights as a technical author and consultant.