首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在变量之后没有进行转换?

为什么在变量之后没有进行转换?
EN

Stack Overflow用户
提问于 2013-12-27 08:00:04
回答 8查看 160关注 0票数 2

拥有animal(Elephant).UseTrunk()不是更合乎逻辑吗?这样,您就不必在代码中乱七八糟地添加这些额外的参数,比如在((Elephant)animal).UseTrunk()中。

这是历史原因吗?它会干扰其他语法吗?还是我漏掉了什么东西?

我对C#语法和语言的干净和纯净有一种近乎宗教的尊重,但对我来说,铸造语法总是有点像害群之马。

PS。我确实知道(动物为大象).UseTrunk(),但这不是问题:)此外,它在理论上是一种解决办法-打破了语言的清洁和纯净的观念。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-12-27 08:26:46

您建议的语法是不明确的!由于dot是c#中的主运算符,它具有最高的优先级,所以不使用括号,您如何解析animal(Elephant).UseTrunk()?正如您所说的,UseTrunk()应该应用于animal(Elephant)而不是(Elephant),而且由于dot具有更高的优先级,它将产生某种模糊性。但是,如果您想降低dot的优先级,那么作为语言设计人员,您将面临更多复杂的问题。此外,使用这种语法,您将如何处理方法调用?如何区分方法调用和cast操作符?因此,实际上最好的方法是使用额外的括号来控制局势。

票数 1
EN

Stack Overflow用户

发布于 2013-12-27 08:14:36

语法

代码语言:javascript
运行
复制
((Elephant) animal).UseTrunk();

来自C,C++。新的C#可能性是。如果Elephant是一个类,而不是构造最精确的类型,则

代码语言:javascript
运行
复制
  Elephant elephant = animal as Elephant;

  if (!Object.ReferenceEquals(null, elephant))
    elephant.UseTrunk();
  else {
    // animal isn't an elephant - do nothing, throw exception etc.
  }

但是通常(如果您确信animal实际上是一个Elephant),您可以简单地

代码语言:javascript
运行
复制
  (animal as Elephant).UseTrunk(); // <- Not recommended, see Athari's comment

如果Elephant是一个结构,那么在最准确的情况下,您必须执行以下操作

代码语言:javascript
运行
复制
  // Drawback: you have to cast twice
  if (animal is Elephant) // <- 1st cast
    ((Elephant) animal).UseTrunk(); // <- 2nd cast
票数 3
EN

Stack Overflow用户

发布于 2013-12-27 15:01:21

((Elephant)animal).UseTrunk()来自于派生C#的C++。

C++也有函数语法Elephant(animal).UseTrunk(),但是C#语言设计人员决定不支持它。原因是它在使名称解析的逻辑复杂化的同时,提供了很少的好处。设计良好的程序不应该经常使用类型铸造,所以这不是一个问题。

可以使用以下扩展方法简化代码:

代码语言:javascript
运行
复制
    public static T To<T> (this object @this)
    {
        return (T)@this;
    }

您的示例变成了animal.To<Elephant>().UseTrunk(),它非常接近您建议的语法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20797060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档