Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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
vb.net与c#对象初始值设定项:c#中的限制?_C#_Vb.net - Fatal编程技术网

vb.net与c#对象初始值设定项:c#中的限制?

vb.net与c#对象初始值设定项:c#中的限制?,c#,vb.net,C#,Vb.net,在VB.NET中,可以使用对象初始值设定项并引用右侧的相同成员,如下所示: GetValue.Add(使用{ .Type=CType(NvpInfo(索引),类型), .Name=NvpInfo(索引+2).ToString, .NvpValues=CType(.Type.GetField(NvpInfo(Index+1).ToString).GetValue(Instances.First(函数(o)o不是零,并且o.GetType=CType(NvpInfo(Index),Type))),N

在VB.NET中,可以使用对象初始值设定项并引用右侧的相同成员,如下所示:

GetValue.Add(使用{
.Type=CType(NvpInfo(索引),类型),
.Name=NvpInfo(索引+2).ToString,
.NvpValues=CType(.Type.GetField(NvpInfo(Index+1).ToString).GetValue(Instances.First(函数(o)o不是零,并且o.GetType=CType(NvpInfo(Index),Type))),NameValuePair()
})
注意,在设置
.NvpValues
的行中,您可以引用
.Type
,这没有问题

但是,如果您尝试在c#中执行此操作(或者像我一样,尝试将项目从vb.net转换为c#),则会出现错误

未申报

我是这样处理的,这并不是因为重复了
((Type)NvpInfo[Index])

functionReturnValue.Add(新数组索引信息{
类型=(类型)NvpInfo[索引],
Name=NvpInfo[Index+2].ToString(),
NvpValues=(NameValuePair[])((类型)NvpInfo[Index]).GetField(NvpInfo[Index+1].ToString()).GetValue(实例。首先(o=>o!=null&&o.GetType()=(类型)NvpInfo[Index]))
});
  • 为什么c#不允许这样?我认为应该。我认为将遗留代码转换为c#应该尽可能轻松
  • 有没有更好的方法来解决这个问题,并且仍然使用对象初始值设定项

  • 为了回答这个问题,我将以您的示例的简化版本为基础

    VB.NET

    Dim c=带有{
    .Prop1=“abc”,
    .Prop2=.Prop1
    }
    Console.WriteLine(c.Prop1)“打印”abc“
    Console.WriteLine(c.Prop2)'打印“abc”
    
    C#

    var c=new SomeClass
    {
    Prop1=“abc”,
    Prop2=Prop1//无法编译。无法在此处引用Prop1。
    };
    控制台写入线(c.Prop1);
    控制台写入线(c.Prop2);
    
    回答最后一个问题:

    有没有更好的方法来解决这个问题,并且仍然使用对象初始值设定项

    因此,您关注的一个问题是,由于C#不允许在对象初始化语句中引用其他属性,因此它会导致您违反
    DRY
    原则。但实际上,您需要做的就是使用变量:

    工作C#不违反干燥原则的示例:

    string temp=“abc”;
    var c=新类
    {
    Prop1=温度,
    Prop2=温度
    };
    控制台写入线(c.Prop1);//打印“abc”
    控制台写入线(c.Prop2);//打印“abc”
    
    为什么c#不允许这样?我认为应该

    显然,只有语言的设计者才能真正回答这个问题。但我至少可以分享为什么我更喜欢C的设计决策。例如,在VB.NET版本中,如果我错误地以不同的顺序初始化属性:

    Dim c=带有{
    .Prop2=.Prop1,
    .Prop1=“abc”
    }
    Console.WriteLine(c.Prop1)“打印”abc“
    Console.WriteLine(c.Prop2)“不打印任何内容
    
    。。。代码仍然是“合法的”,但我现在无意中引入了一个bug,
    Prop2
    现在初始化错误

    因为C#不允许这样做,所以它可以防止大多数与属性初始化顺序相关的bug。我同意,在这个非常简单的例子中,很难想象有人会犯这样的错误。但是,随着更多属性和更复杂的初始化语句的出现,它可能不会如此明显,并且更容易出错。C#帮助您避免这些微妙的错误

    我认为将遗留代码转换为c#应该尽可能轻松

    我猜你是在暗示
    VB.NET
    是一种遗留语言?有些人可能会生气:)

    但更严重的是,您是否暗示应该做出语言设计决策以促进从其他语言的迁移
    C#
    VB.NET
    本身就是两种功能齐全的语言。它们不应该有匹配和对称的语言设计。如果他们这样做了,那么拥有两种不同的语言又有什么意义呢


    不,它们是两种不同的语言,有两种不同的哲学。我们应该感到幸运的是,移民路线和现在一样容易。没有理由需要这样做。

    为了回答这个问题,我将以您的示例的简化版本为基础

    VB.NET

    Dim c=带有{
    .Prop1=“abc”,
    .Prop2=.Prop1
    }
    Console.WriteLine(c.Prop1)“打印”abc“
    Console.WriteLine(c.Prop2)'打印“abc”
    
    C#

    var c=new SomeClass
    {
    Prop1=“abc”,
    Prop2=Prop1//无法编译。无法在此处引用Prop1。
    };
    控制台写入线(c.Prop1);
    控制台写入线(c.Prop2);
    
    回答最后一个问题:

    有没有更好的方法来解决这个问题,并且仍然使用对象初始值设定项

    因此,您关注的一个问题是,由于C#不允许在对象初始化语句中引用其他属性,因此它会导致您违反
    DRY
    原则。但实际上,您需要做的就是使用变量:

    工作C#不违反干燥原则的示例:

    string temp=“abc”;
    var c=新类
    {
    Prop1=温度,
    Prop2=温度
    };
    控制台写入线(c.Prop1);//打印“abc”
    控制台写入线(c.Prop2);//打印“abc”
    
    为什么c#不允许这样?我认为应该

    显然,只有语言的设计者才能真正回答这个问题。但我至少可以分享为什么我更喜欢C的设计决策。例如,在VB.NET版本中,如果我错误地以不同的顺序初始化属性:

    Dim c=带有{
    .Prop2=.Prop1,
    .Prop1=“abc”
    }
    Console.WriteLine(c.Prop1)“打印”abc“
    Console.WriteLine(c.Prop2)“不打印任何内容
    
    。。。代码是