拥有animal(Elephant).UseTrunk()
不是更合乎逻辑吗?这样,您就不必在代码中乱七八糟地添加这些额外的参数,比如在((Elephant)animal).UseTrunk()
中。
这是历史原因吗?它会干扰其他语法吗?还是我漏掉了什么东西?
我对C#语法和语言的干净和纯净有一种近乎宗教的尊重,但对我来说,铸造语法总是有点像害群之马。
PS。我确实知道(动物为大象).UseTrunk(),但这不是问题:)此外,它在理论上是一种解决办法-打破了语言的清洁和纯净的观念。
发布于 2013-12-27 00:26:46
您建议的语法是不明确的!由于dot
是c#中的主运算符,它具有最高的优先级,所以不使用括号,您如何解析animal(Elephant).UseTrunk()
?正如您所说的,UseTrunk()
应该应用于animal(Elephant)
而不是(Elephant)
,而且由于dot
具有更高的优先级,它将产生某种模糊性。但是,如果您想降低dot
的优先级,那么作为语言设计人员,您将面临更多复杂的问题。此外,使用这种语法,您将如何处理方法调用?如何区分方法调用和cast操作符?因此,实际上最好的方法是使用额外的括号来控制局势。
发布于 2013-12-27 00:14:36
语法
((Elephant) animal).UseTrunk();
来自C,C++。新的C#可能性是是,是。如果Elephant
是一个类,而不是构造最精确的类型,则
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
),您可以简单地
(animal as Elephant).UseTrunk(); // <- Not recommended, see Athari's comment
如果Elephant
是一个结构,那么在最准确的情况下,您必须执行以下操作
// Drawback: you have to cast twice
if (animal is Elephant) // <- 1st cast
((Elephant) animal).UseTrunk(); // <- 2nd cast
发布于 2013-12-27 07:01:21
((Elephant)animal).UseTrunk()
来自于派生C#的C++。
C++也有函数语法Elephant(animal).UseTrunk()
,但是C#语言设计人员决定不支持它。原因是它在使名称解析的逻辑复杂化的同时,提供了很少的好处。设计良好的程序不应该经常使用类型铸造,所以这不是一个问题。
可以使用以下扩展方法简化代码:
public static T To<T> (this object @this)
{
return (T)@this;
}
您的示例变成了animal.To<Elephant>().UseTrunk()
,它非常接近您建议的语法。
https://stackoverflow.com/questions/20797060
复制相似问题