Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匿名对象~对象不包含属性的定义_C#_.net_C# 4.0 - Fatal编程技术网

C# 匿名对象~对象不包含属性的定义

C# 匿名对象~对象不包含属性的定义,c#,.net,c#-4.0,C#,.net,C# 4.0,如果我包含f1(),以下代码将不会编译 但是,我在intellisense中看到了X和Y,在f2()中调用calculationXY()时看到了它们的值 f1()编译错误是:对象不包含定义或x{or for y(就此而言),并且.x带红色下划线 private object calculateXY(int id) { // bla bla bla return (new { x = calX, y = calY }); } /* f1() { var p = calcu

如果我包含f1(),以下代码将不会编译

但是,我在intellisense中看到了X和Y,在f2()中调用calculationXY()时看到了它们的值

f1()编译错误是:
对象不包含定义或x{or for y(就此而言)
,并且.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; 
}
calculateXY返回一个没有x或y属性的对象..;您 可以返回动态,或者使用反射读取x和y– KMoussa

正如@KMoussa所说,您正在返回一个对象。最好的选择是返回 动态,但如果要返回一个对象,则应该只返回一个 正确的类或结构–TyCobb

谢谢各位

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

正如@KMoussa所说,您正在返回一个对象。最好的选择是返回 动态,但如果要返回一个对象,则应该只返回一个 正确的类或结构–TyCobb


谢谢大家。

我建议写一个
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
用于其他事情,通常是相当奇特的事情——我知道about多年来从未在生产代码中使用过它

匿名类型,就像在您的原始示例中一样,实际上从未从方法返回。这也是异乎寻常的东西,因为您已经发现了一些原因。有时找到一个合适的返回类型(或者像我们上面所做的那样编写一个返回类型)会有点麻烦,但通常值得付出努力

更新 还有一个选择:

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
作为返回类型。这是可行的,如果它是一个私人助手函数,这并不是你能做的最糟糕的事情,但是如果代码被维护,“Item2 who?”随着时间的推移,成本将超过编写快速类的前期成本。
Tuple
was,IIRC,最初设计用于完成匿名类型现在的用途。

我建议编写
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
用于其他事情,通常是相当奇特的事情——我知道about多年来从未在生产代码中使用过它

匿名类型,就像在您的原始示例中一样,实际上从未从方法返回。这也是异乎寻常的东西,因为您已经发现了一些原因。有时找到一个合适的返回类型(或者像我们上面所做的那样编写一个返回类型)会有点麻烦,但通常值得付出努力

更新 还有一个选择:

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
作为返回类型。这是可行的,如果它是一个私人助手函数,这并不是你能做的最糟糕的事情,但是如果代码被维护,“Item2 who?”随着时间的推移,成本将超过编写快速类的前期成本。
Tuple
was,IIRC,最初设计用于完成匿名类型现在的用途。

我添加这个只是为了完成答案。 在整个解决方案中,这个类只实例化了两次。而且它很小,所以我认为我还可以

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

虽然我并不喜欢这个名字

我想我最近对javascript做了很多工作。JS可能会对我希望摆脱的东西产生问题。哦,好吧

因此,我们看到了又一次毫无意义地疯狂使用全局变量的死亡


谢谢大家的意见。

我添加这个只是为了完成答案。 在整个解决方案中,这个类只实例化了两次。而且它很小,所以我认为我还可以

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

虽然我并不喜欢这个名字

我想我最近对javascript做了很多工作。JS可能会对我希望摆脱的东西产生问题。哦,好吧

因此,我们看到了又一次毫无意义地疯狂使用全局变量的死亡


感谢大家的输入。

claculateXY返回一个
对象
。该对象没有x或y属性;您可以返回一个
动态
,或者使用反射来读取x和y
f2()
也不会编译。如果您没有提供正确的方法声明,则没有帮助(而且您忽略了.NET命名约定)。请提供一个示例,并更清楚地说明您的问题……但请注意,
calculateXY
的返回类型是
object
,因此这是
p
@JonSkeet的编译时类型。他希望它编译的原因非常清楚。他不懂C。非常清楚。他不懂语言,他不懂如何键入用英语写作