我发现以下内容相当奇怪.然后,我主要使用动态语言中的闭包,这对于同一个"bug"应该是不可怀疑的.以下使编译器不满意:
VoidFunction t = delegate { int i = 0; };
int i = 1;
Run Code Online (Sandbox Code Playgroud)
它说:
名为"i"的局部变量不能在此范围内声明,因为它会给"i"赋予不同的含义,"i"已在"子"范围内用于表示其他内容
所以这基本上意味着在委托中声明的变量将具有声明的函数的范围.不完全是我所期望的.我甚至没有尝试过调用这个函数.至少Common Lisp有一个功能,你可以说变量应该有一个动态名称,如果你真的希望它是本地的.这在创建不泄漏的宏时尤其重要,但这样的东西也会有所帮助.
所以我想知道其他人如何解决这个问题呢?
为了澄清我正在寻找一个解决方案,其中我在delegete中声明的变量不会干扰委托后声明的变量.我仍然希望能够捕获委托之前声明的变量.
受这个问题的启发,我开始想知道为什么下面的例子在c#中都是非法的:
VoidFunction t = delegate { int i = 0; };
int i = 1;
Run Code Online (Sandbox Code Playgroud)
和
{
int i = 0;
}
int i = 1;
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有人知道这种语言设计的确切原因?它是否会阻止糟糕的编程实践,如果是这样,为什么不发出警告?出于性能原因(编译和运行时)或原因是什么?
有谁知道是否存在可以使用的WPF某处的虚拟化uniformgrid实现?
我尝试了一个stackoverflow和谷歌,到目前为止没有发现任何东西.
到目前为止我一直使用的是一个带有UniformGrid作为其ItemsPanel的ListBox.但这不会虚拟化.
我有一个带扩展选择模式的简单列表框.选择工作几乎完全正常,就像它在资源管理器中工作.但取消选择并没有真正发挥作用.我想要的是当我点击列表框中元素范围之外的东西时,我希望取消选择所有元素.默认情况下,我似乎没有这样做,我做了一个涉及selectionchanged和mouseup的黑客攻击.但必须有更好的方法.有任何想法吗?
我一直在玩Clojure并且到目前为止印象非常深刻,但我遇到的一件事是来自Clojure的错误消息.它有两种形式:Java错误,如空指针异常和clojure语法错误,如缺少括号对.我想知道是否有人知道如何获得更好的错误消息?
部分原因当然是学习一门新语言,但改进错误信息永远不会受到伤害:)
WPF中的许多控件都具有此设备像素的快照(如MSDN中所述).我经常发现自己忘了设置它然后发现有些东西有时看起来很奇怪.
人们用什么来处理这个问题?
C#3.0引入了var关键字.编译时,编译器会为您插入正确的类型.这意味着它甚至可以在2.0运行时运行.到现在为止还挺好.但是前几天我发现了一个案例,var关键字将被替换为对象,因此不够具体.说你有类似的东西:
var data = AdoMD.GetData(...); // GetData returns a DataTable
foreach (var row in data.Rows)
{
string blah = (string)row[0]; // it fails since it's of type object
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用行时,IntelliSense和编译器都告诉我它是对象类型.data.Rows是类型的System.Data.DataRowCollection.以下作品:
var data = AdoMD.GetData(...); // GetData returns a DataTable
foreach (DataRow row in data.Rows)
{
string blah = (string)row[0]; // works since it now has the right type
}
Run Code Online (Sandbox Code Playgroud)
这不是一个关于VAR的使用问题,对于一个线程在这里.
我正在使用Visual Studio 2008 SP1顺便说一句.
编辑:现在附加了正确的代码.