小编Roh*_*ash的帖子

为什么这些linq输出不同?

第一个声明:

IEnumerable<char> query = "Not what you might expect";

query = query.Where (c => c != 'a');
query = query.Where (c => c != 'e');
query = query.Where (c => c != 'i');
query = query.Where (c => c != 'o');
query = query.Where (c => c != 'u');
Run Code Online (Sandbox Code Playgroud)

产量String.Join("", query):"Nt wht y mght xpct"

第二个声明:

query = "Not what you might expect";

foreach (char vowel in "aeiou")
    query = query.Where (c => c != vowel);
Run Code Online (Sandbox Code Playgroud)

产量 …

c# linq

35
推荐指数
3
解决办法
767
查看次数

浮点数,双精度和十进制最大值与大小

我在C#中遇到了这些数据类型的大小和最大值的混乱模式.

在使用Marshal.SizeOf()比较这些大小时,我发现以下结果 -

Float- 4 bytes,
Double - 8 bytes,
Decimal - 16 bytes
Run Code Online (Sandbox Code Playgroud)

当比较他们的MaxValues时,我得到了这样的结果,

 Float- 340282346638528986604286022844204804240,
 Double - 179769313486231680088648464220646842686668242844028646442228680066046004606080400844208228060084840044686866242482868202680268820402884062800406622428864666882406066422426822086680426404402040202424880224808280820888844286620802664406086660842040886824002682662666864246642840408646468824200860804260804068888,
 Decimal - 79228162514264337593543950335
Run Code Online (Sandbox Code Playgroud)

我感到困惑的原因是,Decimal比Float和Double需要更多的非托管内存,但是不能包含比浮动更大的值.任何人都可以解释编译器的这种行为.谢谢.

c# floating-point double types decimal

14
推荐指数
0
解决办法
4万
查看次数

Devexpress PopupMenu关闭事件,如Windows Contextmenu Closing事件

我正在使用Devexpress PopupMenu在右键单击显示.现在我想在关闭这个弹出菜单之前知道,就像Windows ContextMenu Closing事件一样.

PopupMenu有特写事件,但在关闭它之后会触发.实际上我的目标是根据情况处理何时关闭弹出菜单.

无论如何,我能实现吗?

c# devexpress popupmenu winforms

5
推荐指数
1
解决办法
1563
查看次数

如何在 C# 中从 Action&lt;T&gt; 委托调用非静态方法

由于我正在编写要执行的某些操作的通用概念,因此我需要在操作委托中调用一些非静态方法。另外,它们在我的代码中都不是静态的。但我仍然无法调用 Action 定义中的非静态方法。这是我的代码-

private Dictionary<string, Action<object>> m_dicUndoRedoAction = new Dictionary<string, Action<object>>();
m_dicUndoRedoAction.Add("DeleteClass", DeleteClassFromeNode );
Run Code Online (Sandbox Code Playgroud)

这是DeleteClass的定义

private Action<object> DeleteClassFromeNode =
  data =>
  {
    Tuple<itemType1, itemType2> items = data as Tuple<itemType1, itemType2>;
    if (items != null && items.Item2 != null)
    {
      DeleteClass(items.Item2); // This is my non static method in the same class.
    }
  };
Run Code Online (Sandbox Code Playgroud)

这是我如何称呼代表

private void Undo_Executed(object sender, ExecutedRoutedEventArgs e)
{
  object temp;
  if (UndoRedoAction.DoUndo(out temp))
  {
    m_dicUndoRedoAction["DeleteClass"].Invoke(temp);
  }
}
Run Code Online (Sandbox Code Playgroud)

正如编译器所说

字段初始值设定项无法引用非静态字段、方法或属性“DeleteClassFromeNode”

我还查看了MSDN关于Action文章的参考,但是MS没有提到Action是否是隐式静态的,或者我是否走错了路?我还查找了静态方法的一些非静态调用,但没有一个得到令人满意的解释。如果有人提供低级解释,我将不胜感激。

关于回应彼得的解释

尽管初始化程序在构造函数完成之前运行,但这并不意味着它会在构造函数执行之间触发委托。即使您在 ILDASM 中查找其汇编代码,它也会将实际操作字段显示为非静态,但将缓存的匿名委托对象显示为静态。为什么编译器会有这种不同的行为?

在此输入图像描述

c# generics static delegates

4
推荐指数
1
解决办法
3109
查看次数