C#中的三元组有什么限制的原因吗?失败:对象o=((1==2)?1:"test");成功:对象o;如果(1==2){o=1;}else{o="测试";}first语句中的错误是:无法确定条件表达式的类型,因为'int'和'string'之间没有隐式转换。为什么需要这个,我是把这些值赋给object类型的变量。编辑:上面的例子很简单,是的,但是有一些例子会很有用:int?订阅号;//作为参数传入EntityParameterp1=newEntityParameter("SubscriptionID",DbType.Int32){Value=((subscriptionID==null)?DBNull.Value:subscriptionID),}use:objecto=((1==2)?(对象)1:“测试”);问题是条件运算符的返回类型无法明确确定。也就是说,在int和string之间,没有最好的选择。编译器将始终使用true表达式的类型,并在必要时隐式转换false表达式。编辑:在你的第二个例子中:int?订阅号;//作为参数传入EntityParameterp1=newEntityParameter("SubscriptionID",DbType.Int32){Value=subscriptionID.HasValue?(对象)订阅ID:DBNull。值,}PS:这不叫“三元运算符”。它是一个三元运算符,但它被称为“条件运算符”。虽然其他答案是正确的,但就它们是真实且相关的陈述而言,这里有一些语言设计的微妙之处没有表达出来。许多不同的因素影响了条件运算符的当前设计。首先,希望尽可能多的表达式具有可以仅从表达式的内容确定的明确类型。出于几个原因,这是合乎需要的。例如:它使构建IntelliSense引擎变得更加容易。您键入xM(some-expression。IntelliSense需要能够分析某些表达式,确定其类型,并在IntelliSense知道xM指的是什么方法之前生成下拉列表。如果M重载,IntelliSense直到知道xM指的是什么它看到了所有参数,但您还没有输入第一个参数。其次,我们更喜欢类型信息“由内而外”流动,因为正是我刚才提到的场景:重载决议。考虑以下内容:voidM(objectx){}voidM(intx){}voidM(stringx){}...M(b?1:"hello");这个应该怎么办?应该叫对象重载吗?是字符串重载有时调用,有时调用int重载?如果你有另一个重载,比如M(IComparablex)-什么时候选择它呢?当类型信息“双向流动”时,事情变得非常复杂。说“我正在将这个东西分配给一个Object类型的变量,所以编译器应该知道选择Object作为“不洗的类型”;因为那是我们试图弄清楚的过程。重载解析正是从参数类型中找出参数类型的过程,参数类型是您为其分配参数的变量。如果参数的类型取决于它们分配给的类型,那么我们的推理就是循环的。对于lambda表达式,类型信息确实“双向流动”;实施这项努力有效地带走了我一年中最美好的时光。我已经写了相当多的文章来描述设计和实现编译器遇到的一些困难,这些困难可以分析类型信息流入复杂表达式的情况,具体取决于可能使用表达式的上下文。第一部分在这里:http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx你可能会说“好吧,好吧,我明白了为什么编译器不能安全地使用我正在分配给对象的事实,我理解为什么表达式必须具有确定的类型,但为什么类型表达式对象不是因为int和string都可以转换为对象?“这让我想到了第三点:第三,C#的一个微妙但一贯应用的设计原则是“不要通过魔法生成类型”。当给定一个表达式列表时,我们必须从中确定一个类型,而我们确定的类型总是在列表中的某个位置。我们从不为新类型创造魔力并为您选择;您获得的类型始终是您为我们选择的类型。如果你说你想在一组类型中找到最好的类型,我们会在那个集合中找到最好的类型。在集合{int,string}中,没有像“Animal,Turtle,Mammal,Wallaby”这样最常见的类型。此设计决策适用于条件运算符、类型推断统一场景、隐式类型数组类型的推断等。此设计决策的原因是它使普通人更容易弄清楚编译器将在任何情况下做什么必须确定最佳类型的给定情况;如果你知道那个类型在那里,盯着你看,那将被选中,就更容易找出将要发生的事情。它还避免了我们在出现冲突时必须制定复杂的规则来确定什么是一组类型的最佳公共类型。假设您有类型{Foo,Bar},其中两个类都实现了IBlah,并且两个类都继承自Baz。哪个是最好的通用类型,IBlah,两者都实现,或者Baz,两者都扩展?我们不想回答这个问题;我们想完全避免它。最后,我注意到C#编译器在一些模糊的情况下实际上确定了错误的类型。我的第一篇文章在这里:http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-in??ference-woes-part-one.aspx事实上,编译器确实是有争议的,它是正确的并且规格有误;在我看来,按实现设计比按规范设计更好。无论如何,这些只是设计三元运算符这一特定方面的几个原因。这里还有其他细微之处,例如CLR验证程序如何确定一组给定的分支路径是否保证在所有可能路径的堆栈中都保留了正确的类型。详细讨论这个问题会让我走得更远。为什么功能X以它的方式工作通常是一个很难回答的问题。回答实际行为要容易得多。我的教育猜测为什么。允许条件运算符简洁地使用布尔表达式来选择2个相关值。它们必须相关,因为它们在一个地方使用。如果用户改为选择2个不相关的值,则代码中可能存在细微的拼写错误/错误,编译器最好警告它们而不是隐式转换为对象。这可能是他们没有预料到的。“int”是原始类型,不是对象,“string”被认为是“原始对象”。当您执行类似“objecto=1”的操作时,您实际上是在将“int”加载到“Int32”中。这是一篇关于装箱的文章的链接:http://msdn.microsoft.com/en-us/magazine/cc301569.aspx一般来说,应该避免装箱,因为性能损失很难追踪。当您使用三元表达式时,编译器根本不会查看赋值变量来确定最终类型是什么。将原始语句分解为编译器正在执行的操作:declaration:objecto=((1==2)?1:"test");compilation:'((1==2)?1:"test")'中的“1”和“test”是什么类型?他们匹配吗?#1的最终类型是否匹配'objecto'的赋值运算符类型?这会失败,因为编译器在#1完成之前不会评估#2。以上是C#学习教程:C#中的三元数有限制吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
