【发布时间】:2011-01-12 23:21:56
【问题描述】:
我认为我在这里有一个根本的误解。为什么测试失败?
public static class ObjectExtensions
{
public static Action To<T>(this T newValue, T oldValue) where T : class
{
return () => oldValue = newValue;
}
}
public static class Assign
{
public static T TheValue<T>(T theValue)
{
return theValue;
}
}
public class Tests
{
public void Test()
{
var a = new TestType { Name = "a" };
var b = "b";
Assign.TheValue(b).To(a.Name)();
Assert.That(a.Name == "b"); //fails (a.Name == "a")
}
}
public class TestType { public string Name {get;set;} }
【问题讨论】:
-
为什么会变成“b”?您只是在各个点按值传递字符串引用。
-
我的想法是:“b”(newValue)的引用和“a”(oldValue)的引用将提供给方法To,该方法将返回用于将 newValue 分配给 OldValue 的 lambda。此 lambda 将由行 Assign.TheValue(b).To(a.Name)(); 上的第三组括号计算。显然我的理解是完全错误的。
-
想想什么是变量。 “oldValue”是一个变量。它有自己的 存储。它不是其他变量的别名。 “ref”关键字确实为变量创建别名,这正是为什么在闭包中捕获 ref 变量是非法的;因为那么你可以捕获一个生命周期比闭包生命周期短的变量。
-
谢谢埃里克。您的评论帮助降低了这一成本。我相对缺乏 lambda 的经验让我失望了。
标签: c# reference closures variable-assignment