Rice
Rice

Reputation: 3531

Nested Ternary Implicit type Conversion issue: Type of conditional expression cannot be determined because there is no implicit conversion between

I have used nested ternaries in the past quite frequently with c#. After I introduced An event handler, as the assignment operation, I was presented with the error: "Type of conditional expression cannot be determined because there is no implicit conversion between 'void' and 'void'"

Here are two snippets of the code I am writing, the top one is functional and the bottom one gives the type conversion error:

   AppTableConfigCollection collection = 
            tableType == TableType.Attribute
                ? _attributeTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.ATTRIBUTE) 
                    : tableType == TableType.Core
                        ? _coreTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.CORE)
                        : tableType == TableType.Domain
                            ?_domainTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.DOMAIN)
                            : tableType == TableType.Configuration
                                ?_configTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.CONFIG)
                                    :_offlineTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.OFFLINE);





        PropertyChangedEventHandler property =
            tableType == TableType.Attribute
                ? _attributeTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged)
                : tableType == TableType.Core
                    ? _coreTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged)
                    : tableType == TableType.Domain
                        ? _domainTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged)
                        : tableType == TableType.Configuration
                            ? _configTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged)
                                : _offlineTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged);

Thank you for any help you are able to provide!

Upvotes: 0

Views: 212

Answers (2)

devuxer
devuxer

Reputation: 42374

First of all, do listen to the commenters. Switch/case really does seem like it would result in more readable, maintainable code.

Second of all, what you are trying to do in your second code snippet is set your property changed handler to the result of subscribing to a handler, which is void.

Specifically, _attributeTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged) does not return a value--it returns void. So, you're assignment is not possible.

You must do what you're trying to do in separate steps.

For example:

PropertyChangedEventHandler handler;
switch (tableType)
{
    case TableType.Attribute:
        handler = new PropertyChangedEventHandler(appTableConfigs_PropertyChanged);
        _attributeTableConfigs.PropertyChanged += handler;
        break;
    case TableType.Core:
        handler = new PropertyChangedEventHandler(appTableConfigs_PropertyChanged);
        _coreTableConfigs.PropertyChanged += handler;
        break;
    case TableType.Domain:
        handler = new PropertyChangedEventHandler(appTableConfigs_PropertyChanged);
        _domainTableConfigs.PropertyChanged += handler;
        break;
    case TableType.Configuration:
        handler = new PropertyChangedEventHandler(appTableConfigs_PropertyChanged);
        _configTableConfigs.PropertyChanged += handler;
        break;
    default:
        handler = new PropertyChangedEventHandler(appTableConfigs_PropertyChanged);
        _offlineTableConfigs.PropertyChanged += handler;
        break;
}

Or, if the handler is always the same:

PropertyChangedEventHandler handler = appTableConfigs_PropertyChanged;
switch (tableType)
{
    case TableType.Attribute:
        _attributeTableConfigs.PropertyChanged += handler;
        break;
    case TableType.Core:
        _coreTableConfigs.PropertyChanged += handler;
        break;
    case TableType.Domain:
        _domainTableConfigs.PropertyChanged += handler;
        break;
    case TableType.Configuration:
        _configTableConfigs.PropertyChanged += handler;
        break;
    default:
        _offlineTableConfigs.PropertyChanged += handler;
        break;
}

Upvotes: 5

Sorceri
Sorceri

Reputation: 8033

I would suggest using a switch statement as it is easier to read and update

switch (tableType)
        {
            case TableType.Attribute:
                _attributeTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.ATTRIBUTE);
                _attributeTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged);
                break;
            case TableType.Core:
                _coreTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.CORE);
                _coreTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged)
                break;
            case TableType.Domain:
                _domainTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.DOMAIN);
                _domainTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged)
                break;
            case TableType.Configuration:
                _configTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.CONFIG);
                _configTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged)
                break;
            default:
                _offlineTableConfigs = new AppTableConfigCollection(_db, AppTableConfigCollection.OFFLIINE);
                _offlineTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged);
                break;
        }

Upvotes: 4

Related Questions