有谁可以解释为什么下面的代码失败?
type TIDEThemeObserverFunc = reference to procedure(foo: integer);
var fObserverFuncs: TList<TIDEThemeObserverFunc>
function RegisterEventObserver(aObserverFunc: TIDEThemeObserverFunc): Pointer;
begin
fObserverFuncs.Add(aObserverFunc);
Result := @aObserverFunc;
// line below somehow fails
assert(fObserverFuncs.IndexOf(TIDEThemeObserverFunc(Result)) <> -1);
end;
Run Code Online (Sandbox Code Playgroud)
我假设匿名方法可以简单地通过指针进行转换和使用,但这似乎是一个错误的假设.此外,任何解释如何在引擎盖下实现匿名方法的资源都会很棒.TIA.
我正在尝试遍历所有组件,并且对于那些实现ISupportsOpen的人来说,允许打开一个项目.问题是当调用匿名方法时,组件变量总是相同的元素(来自IEnumerable的外部作用域)
foreach (ISupportsOpen component in something.Site.Container.Components.OfType<ISupportsOpen>())
{
MyClass m = new MyClass();
m.Called += new EventHandler(delegate(object sender, EventArgs e)
{
if (component.CanOpenProject(..)) component.OpenProject(..);
});
itemsList.Add(m);
}
Run Code Online (Sandbox Code Playgroud)
请问应该如何解决?
我想要做的是将一个匿名方法作为函数结果分配给相同类型的变量.德尔福抱怨说不能做出任命.显然Delphi的东西我想分配"GetListener"函数而不是相同函数的结果.非常感谢任何帮助.
type
TPropertyChangedListener = reference to procedure (Sender: TStimulus);
TMyClass = class
function GetListener:TPropertyChangedListener
end;
....
var MyClass: TMyClass;
Listener: TPropertyChangedListener;
begin
MyClass:= TMyClass.create;
Listener:= MyClass.GetListener; // Delphi compile error: E2010 Incompatible types: TPropertyChangedListener' and 'Procedure of object'
end;
Run Code Online (Sandbox Code Playgroud) <%= MyClass.GetData(() => new[] { Html.TextBox(prefix + "Postcode", Customer.ZipCode, new { maxlength = 7 }), Html.ValidationIcon(prefix + "ZipCode") })%>
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下MyClass.GetData方法作为参数传递了什么吗?
我不期待一个完整的解释,我知道我应该进一步学习anonyous方法和lamda表达式...但是现在你可以解释代码是什么,从"()=> ......."手段?
如果你知道一些很好的文章,建立在理解这样的材料,那将是很酷的!
我有以下定义.
type
TOmniTaskDelegate = reference to procedure(const task: IOmniTask);
Run Code Online (Sandbox Code Playgroud)
我应该使用什么类型的容器(应该在D2009中支持)来存储TOmniTaskDelegate实例的列表?目前我正在使用,array of TOmniTaskDelegate但我对此并不满意.
我有以下代码,
PB.ForEach(Function(x) x.Cost = GetPartCost(x.PartNumber, x.Units, x.Cost, FB))
Return PB.Sum(Function(x) (x.Cost * x.Qty))
Run Code Online (Sandbox Code Playgroud)
但它始终返回0.我已检查并且GetPartCost函数执行并返回非零数字,但列表项成本属性永远不会更新.
该物业只是一个简单的财产,
Public Property Cost() As Double
Get
Return _Cost
End Get
Set(ByVal value As Double)
_Cost = value
End Set
End Property
Run Code Online (Sandbox Code Playgroud)
如果我Set在属性中设置断点,它永远不会被击中.
这是怎么回事?
在我的学习过程中,我使用Nick Hodges撰写的"Delphi中的编码"一书.我正在使用Delphi 2010.
在关于匿名方法的章节中,他提供了一个关于伪造.NET的非常有趣的例子using.当我尝试编译示例时,我从编译器中收到错误.请帮我看一下结果.
我的课:
type
TgrsObj = class
class procedure Using<T: class>(O: T; Proc: TProc<T>); static;
end;
implementation
{ TgrsObj }
class procedure TgrsObj.Using<T>(O: T; Proc: TProc<T>);
begin
try
Proc(O);
finally
O.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
以下是我尝试使用上述代码的方法:
procedure TForm4.Button1Click(Sender: TObject);
begin
TgrsObj.Using(TStringStream.Create,
procedure(ss: TStringStream)
begin
ss.WriteString('test string');
Memo1.Lines.Text := ss.DataString;
end);
end;
Run Code Online (Sandbox Code Playgroud)
编译错误:
[DCC Error] uMain.pas(36): E2010 Incompatible types: 'TProc<ugrsObj.Using<T>.T>' and 'Procedure'
Run Code Online (Sandbox Code Playgroud) 我正在寻找最短的代码来创建方法来对IEnumerable中的项执行常见操作.
例如:
public interface IPupil
{
string Name { get; set; }
int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我对解决这些例子的各种方法感兴趣:foreach(长手),委托,LINQ,匿名方法等......
对不起的措辞很抱歉,我无法准确描述我追求的是什么!
Imports System.Reflection
Public Class Test
Private Field As String
End Class
Module Module1
Sub Main()
Dim field = GetType(Test).GetField("Field", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim test = New Test
Dim GetValue = New Func(Of Test, String)(Function(t As Test) field.GetValue(test))
'This line indicates a compile error: 'Expression does not produce a value':
Dim SetValue = New Action(Of Test, String)(Function(t As Test, value As String) field.SetValue(test, value))
End Sub
End Module
Module Module2
Dim field = GetType(Test).GetField("Field", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance) 'Is Shared (Module)
Sub …Run Code Online (Sandbox Code Playgroud) 我正在我的项目中使用匿名函数.直到知道我在想,C#编译器只使用在同一个类中使用匿名方法的代码生成一个方法.但是,在IL中反编译此代码之后,我看到CLR创建了一个新类.
public class Comparer
{
public delegate int Greater(int a, int b);
public int Great(Greater greater, int a, int b)
{
return greater(a, b);
}
}
static void Main(string[] args)
{
int valueOfA = 11,
valueOfB = 23,
valueOfC = 42;
Comparer comparer = new Comparer();
Console.WriteLine("The greater is \t:{0}",
comparer.Great(delegate(int a, int b)
{
int[] numbers = new int[] { a, b, valueOfC };
return Math.Max(Math.Max(a, b), valueOfC);
},
valueOfA, valueOfB));
}
Run Code Online (Sandbox Code Playgroud)
这是Main方法的反编译IL代码:
.method private …Run Code Online (Sandbox Code Playgroud) c# ×4
delphi ×4
lambda ×3
.net ×2
delphi-2010 ×2
generics ×2
vb.net ×2
action ×1
clr ×1
containers ×1
delegates ×1
delphi-2009 ×1
linq ×1
scope ×1