【问题标题】:Nested Ternary Implicit type Conversion issue: Type of conditional expression cannot be determined because there is no implicit conversion between嵌套三元隐式类型转换问题:无法确定条件表达式的类型,因为之间没有隐式转换
【发布时间】:2016-03-08 15:11:11
【问题描述】:

过去我在 c# 中经常使用嵌套三元组。引入An event handler后,作为赋值操作,报错:“无法确定条件表达式的类型,因为'void'和'void'之间没有隐式转换”

这是我正在编写的代码的两个sn-ps,上面的一个是功能性的,下面的一个给出类型转换错误:

   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);

感谢您提供的任何帮助!

【问题讨论】:

  • 来自地狱的神圣三元......我认为你在滥用它的含义。我认为这将很难帮助您弄清楚。
  • Argh 不要写这样难以辨认的代码。它是如此不可维护。
  • 顺便说一句,像_attributeTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged) 这样的操作不会返回PropertyChangedEventHandler 供您分配。这可能是你的问题。
  • 你可能想要使用 switch 语句
  • 使用 if-else。三元运算符不是为此目的而制作的。

标签: c# ternary-operator


【解决方案1】:

首先,请听取评论者的意见。 Switch/case 确实看起来确实会产生更易读、更可维护的代码。

其次,您在第二个代码 sn-p 中尝试做的是将您的属性更改处理程序设置为订阅处理程序的结果,这是无效的。

具体来说,_attributeTableConfigs.PropertyChanged += new PropertyChangedEventHandler(appTableConfigs_PropertyChanged) 不返回值 - 它返回 void。所以,你的任务是不可能的。

你必须在不同的步骤中做你想做的事情。

例如:

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;
}

或者,如果处理程序始终相同:

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;
}

【讨论】:

  • 感谢您的输入以及提供其无法正常运行的原因
【解决方案2】:

我建议使用 switch 语句,因为它更易于阅读和更新

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;
        }

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 2018-03-14
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多