匿名对象〜对象不包含属性的定义

时间:2016-11-02 15:07:58

标签: c# .net c#-4.0

如果我包含f1()。

,则不会编译以下代码

然而,我看到X&在智能感知中的Y,在调用f2()的调用中调用calculateXY()时的值。

f1()编译错误为:object does not contain a definition or x {or for y for that matter,.x为红色下划线。

private object calculateXY(int id) {
    // bla bla bla
    return (new { x = calX, y = calY });
}

/*
f1() {
    var p = calculateXY(10);
    p.x + 1;    
}
*/

f2() {
    var p = calculateXY(10);
    //p.x + 1; 
}

3 个答案:

答案 0 :(得分:2)

我添加这个只是为了完成答案。 在整个解决方案中,此类仅实例化两次。它很小所以我觉得我没事。

public class plotPoint {
    public plotPoint (int x, int y){
        this.x = x;
        this.y = y;
    }
    public int x { get; set; }
    public int y { get; set; }
}

private plotPoint calculateXY(int id) { 
    //bla bla bla 
    return (new plotPoint(_pointX, _pointY));
}

虽然我并不喜欢这个名字。

我想我最近一直在做很多javascript。 JS会对我希望逃避的事情有疑问。哦,好吧。

因此,我们看到了另一个无谓的疯狂使用全局变量的死亡。

感谢大家的投入。

答案 1 :(得分:0)

  

calculateXY返回一个没有x或y属性的对象。您   可以返回动态,或使用反射来读取x和y -   的 KMoussa

  

正如@KMoussa所说,你正在归还一个物体。最好的办法是回归   动态,但如果你要返回一个对象,你应该返回一个   适当的类或结构。 - TyCobb

谢谢你们。

答案 2 :(得分:0)

我建议写一个IntPoint课程:

public class IntPoint { int X; int Y; }

然后归来。确保将方法的返回类型声明为IntPoint,这样您就可以轻松使用返回值而不会产生任何废话:

private IntPoint CalculateXY(int id) {
    // bla bla bla
    return new IntPoint { X = calX, Y = calY };
}

...

IntPoint ip = CalculateXY(12);

Console.WriteLine(ip.X);

我不建议使用dynamic。如果按照我上面建议的方式执行此操作,则会将编译器放在您的角落,代表您工作,以确保调用您的方法的任何代码都知道它正在获取并正确使用它。 dynamic用于其他事情,通常是相当异乎寻常的事情 - 我已经了解它多年并且从未在生产代码中使用它。

与原始示例一样,匿名类型几乎从不从方法返回。由于您已经发现的原因,这也是异国情调的东西。有时候找一个合适的返回类型会更麻烦(或者写一个,就像我们上面所做的那样),但这通常是值得的。

更新

这是另一种选择:

private void CalculateXY(int id, out int x, out int y) {
    // bla bla bla
    x = calX;
    y = calY;
}

像......一样打电话。

int x, y;

CalculateXY(32, out int x, out int y);

这不是我最喜欢的,但它是一个强类型,正确命名的选项,并且不需要编写一个新类来保存返回类型。我不介意在代码中看到它。

在评论中,@ KMoussa建议Tuple<int,int>作为返回类型。这是可行的,如果它是一个私人助手函数,那不是你能做的最糟糕的事情,但如果代码被维护了“Item2 ?”随着时间的推移,成本将超过编写快速课程的前期成本。 Tuple是IIRC,最初设计用于执行现在使用的匿名类型。