在下面的简单代码段中:
static void Main(string[] args)
{
Expression<Func<string, bool>> equal = s => s == "test";
LambdaExpression lambda = Expression.Lambda(equal.Body, Expression.Parameter(typeof(string), "s"));
lambda.Compile();
}
Run Code Online (Sandbox Code Playgroud)
编译方法失败了 InvalidOperationException
"范围''引用的'System.String'类型的变量'',但未定义".
虽然我发现了其他类似的问题,但我无法理解所提供的答案.
LambdaExpression的DebugView包含:
.Lambda #Lambda1<System.Func`2[System.String,System.Boolean]>(System.String $s) {
$s == "test"
}
Run Code Online (Sandbox Code Playgroud)
那么,我在这个问题上的其他例子已经看到,参数和使用不匹配,这并不出现在这里是一个问题.我究竟做错了什么?
我在这里有这个功能:
let ProcessFile (allLines: string list) =
let list = new List<List<string>>()
let rec SplitFile (input: string list) =
if input.Length <> 0 then
list.Add(new List<string>(input.TakeWhile(fun x -> x <> "")))
let nextGroup = input.SkipWhile(fun x -> x <> "").SkipWhile(fun x -> x = "")
SplitFile (Seq.toList nextGroup)
SplitFile allLines |> ignore
list
Run Code Online (Sandbox Code Playgroud)
它将文件的内容作为字符串列表给出,并将每个由空行分隔的组作为单独的列表,给出一个列表列表.
我的问题是,有没有更好的方法来实现这一点,让我有一个像字符串列表一样的东西,而不是我必须使用新的List <List <string >>?因为这对我来说似乎并不特别.
在给定的示例中(对于代码样式而言,它是为了一个紧凑的自包含repro的兴趣),被调用的方法始终是B中的虚方法,它具有附加的整数参数,而我希望该方法在C将是一个叫做的人.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MethodChoosing
{
class Program
{
static void Main(string[] args)
{
C c = new C();
c.M();
Console.ReadKey();
}
}
public class A
{
public virtual void M(bool? a = null)
{
Console.WriteLine("base base");
}
}
public class B : A
{
public override void M(bool? a = null)
{
Console.WriteLine("base override");
}
public virtual void M(bool? a = null, int? b = null)
{
Console.Write("base new");
}
} …Run Code Online (Sandbox Code Playgroud) 我正在努力了解下面示例中List发生的事情:
public class DataObject
{
public List<object> SomeObjects { get; set; }
}
class Program
{
static void Main(string[] args)
{
var dataObj = new DataObject()
{
SomeObjects = { new object() },
};
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
创建dataOjb显然失败,因为该SomeObjects属性尚未实例化.我假设没有编译错误,因为DataObject可能有一个实例化的构造函数SomeObjects.鉴于此,如果我尝试做类似的事情:
List<int> SomeObjects;
SomeObjects = {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,也不起作用:
List<int> SomeObjects = new List<int>();
SomeObjects = {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)
那么为了得到我的实际问题,在第一个对象初始化器中调用了什么(我已经尝试查找它并且找不到它),为什么它的行为有所不同,还有其它地方可以像这样使用?