小编Mis*_*hax的帖子

我在哪里可以找到C#5语言规范?

C#5.0自2012年8月开始推出.我在哪里可以找到规格?他们已经停止了ECMA规范,但MSDN怎么样?

c# language-specifications c#-5.0

39
推荐指数
2
解决办法
1万
查看次数

"原始类型"与"内置值类型"

我最近在使用Array.SetValue(Int32)方法时在C#中遇到了异常.例外是:

无法从源类型扩展到目标类型,因为源类型不是基本类型或无法完成转换.

对"原始"这个词的引用让我感到有些惊讶,因为我认为倾向于将这些类型称为内置类型,而"原始类型"一词也是一个非正式术语."原始"类型和"内置值类型"之间有什么区别?我没有在C#语言规范中找到原始类型的定义.

c# types

27
推荐指数
1
解决办法
1万
查看次数

如何从Array.ConstrainedCopy获取InvalidCastException

以下是讨论的示例代码(考虑爬虫"是"动物和哺乳动物"是"动物也是如此")

Animal[] reptiles = new Reptile[] 
    { new Reptile("lizard"), new Reptile("snake") };

Animal[] animals = new Animal[]
    { new Reptile("alligator"), new Mammal("dolphin") };

try
{
  Array.ConstrainedCopy(animals, 0, reptiles, 0, 2);
}
catch (ArrayTypeMismatchException atme)
{
  Console.WriteLine('[' + String.Join<Animal>(", ", reptiles) + ']');
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我得到一个ArrayTypeMismatchException,带有注释

Array.ConstrainedCopy仅适用于可证明兼容的数组类型,不会对每个数组元素进行任何形式的装箱,拆箱,加宽或转换.更改数组类型(即,将Derived []复制到Base []),或者在CER for Array.Copy不太强大的可靠性契约中使用缓解策略,例如克隆数组或丢弃可能损坏的目标数组.

但是,当我看到MSDN时,我看到这个方法也引发了一个问题InvalidCastException.投掷的条件InvalidCastException是:

sourceArray中至少有一个元素无法强制转换为destinationArray类型.

所以,我很为难,怎么你得到一个InvalidCastException了这种方法,如果因为它规定永远不会有一个数组元素的任何铸造?

.net c# arrays

19
推荐指数
1
解决办法
1090
查看次数

用C#填充数组

在Java中,类Arrays中大约有18个静态"填充"方法,用于为数组中的每个元素分配一个值.我正在寻找C#中的等价物以实现同样的目的,但我找不到具有相同紧凑性的任何东西:

1)ForEach,因为我理解通过值传递数组中的元素,所以我不能更改它们

2)从Enumerable重复创建一个新数组,创建一个新数组然后从数组中复制每个元素似乎是开销

3)for循环并不漂亮,我想这就是为什么Java人员开始介绍这个紧凑的符号

4)Array类中的Clear方法可以将所有内容都设置为零,但是如何将零转换为我想要的非零值?

要演示Java的语法,请考虑此代码打印数字7的三倍:

int[] iii = {1, 2, 3};
Arrays.fill(iii, 7);
for (int i : iii) {
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

c# arrays

18
推荐指数
4
解决办法
9万
查看次数

WPF入队并重放关键事件

我正在尝试提高WPF业务应用程序的响应能力,以便当用户在服务器响应之后等待新屏幕出现的"屏幕之间"屏幕时,他们仍然可以输入数据.我能够对事件进行排队(在后台面板上使用PreviewKeyDown事件处理程序),但是当我加载时,我很难将新事件中的事件抛出.特别是新面板上的Te​​xtBoxes没有拾取文本.我已尝试提升相同的事件(在捕获它们时将Handled设置为true,再次提升时将Handled设置为false)创建新的KeyDown事件,新的PreviewKeyDown事件,执行ProcessInput,在面板上执行RaiseEvent,将焦点设置在右侧TextBox和TextBox上的RaiseEvent做了很多事情.

看起来应该很简单,但我无法弄明白.

以下是我尝试过的一些事情.考虑一个名为EventQ的KeyEventArgs队列:

这是一件不起作用的事情:

        while (EventQ.Count > 0)
        {
            KeyEventArgs kea = EventQ.Dequeue();
            tbOne.Focus(); // tbOne is a text box
            kea.Handled = false;
            this.RaiseEvent(kea);
        }
Run Code Online (Sandbox Code Playgroud)

这是另一个:

        while (EventQ.Count > 0)
        {
            KeyEventArgs kea = EventQ.Dequeue();
            tbOne.Focus(); // tbOne is a text box
            var key = kea.Key;                    // Key to send
            var routedEvent = Keyboard.PreviewKeyDownEvent; // Event to send
            KeyEventArgs keanew = new KeyEventArgs(
                Keyboard.PrimaryDevice,
                PresentationSource.FromVisual(this),
                0,
                key) { RoutedEvent = routedEvent, Handled = false };

            InputManager.Current.ProcessInput(keanew);
        }
Run Code Online (Sandbox Code Playgroud)

而另一个: …

keyboard wpf

11
推荐指数
1
解决办法
4569
查看次数

Java注释 - 标识符或类型名称

Java语言规范指出,一个正常的注释的格式为

NormalAnnotation:
  @ TypeName(ElementValuePairs opt)

单元素注释的格式为:

SingleElementAnnotation:
  @ Identifier(ElementValue)

我不明白,为什么这种不一致,为什么是正常的注释TypeName和单个元素注释Identifier?我认为引用Identifier可能是规范中的错误,因为Identifier不合格,javac接受符合条件的AnnotationDeclarations,用于普通注释和单个元素注释.

java annotations language-lawyer

8
推荐指数
1
解决办法
938
查看次数

C#中的文档注释:更喜欢///或/**的技术理由是什么

C#语言规范的附录A涉及文档注释,它指出有两种形式:

single-line-doc-comment:
/// input-charactersopt
delimited-doc-comment:
/**delimited-comment-textopt*/

有偏好吗?我注意到倾向于选择单行文档评论格式,但我不知道除了人们从美学观点选择之外是否存在技术或实践原因.

我还在Jones和Freeman的"C#for Java Developers"一书中读到了以下内容:

代码文档注释前面有三个正斜杠,如下所示:
/// A single line documentation comment.
C#规范还建议使用熟悉的/**标记来标识多行文档注释.但是,C#编译器的7.00版本不支持此语法.

我一直无法验证csc的最新版本是否与多行语法不兼容.据我所知,这种语法运行得很好.

**edit**有人要求展示样品.这是样本:

/// <summary>
/// Performs a Method1 calculation on two strings
/// </summary>
/// <param name="arg1">The first string</param>
/// <param name="arg2">The second string</param>
/// <returns>The number 3</returns>
public static int Method1(String arg1, String arg2)
{
    return 3;
}
/**
 * <summary>
 * Performs a Method2 calculation on two strings
 * </summary>
 * <param name="arg1">The first string</param>
 * <param name="arg2">The second …
Run Code Online (Sandbox Code Playgroud)

c# xml-documentation

8
推荐指数
1
解决办法
1749
查看次数

MDIParent Tiling儿童

有没有办法轻易地平铺mdi父母的所有形式的孩子?我正在寻找Windows提供的大部分功能,平铺级联.有人知道一个简单的方法吗?

.net mdi parent mdiparent winforms

6
推荐指数
1
解决办法
2082
查看次数

OptionalFieldAttribute实际上有效吗?

MSDN上他们写

可以通过对其应用OptionalFieldAttribute属性将字段标记为可选字段.在反序列化期间,如果缺少可选数据,序列化引擎会忽略缺席并且不会抛出异常.

我无法得到例外.我试图创建一个类,用SerializableAttribute标记它,用BinaryFormatter序列化一个对象并将状态保存到磁盘上的文件,然后在我的类中添加两个字段,我没有用OptionalFieldAttribute标记,并试图反序列化对象回来,我只是坚持到磁盘.我很惊讶没有抛出异常?

c# serialization

6
推荐指数
1
解决办法
1598
查看次数

为什么Arrays.binarySearch(Object [],Object)采用Object args?

方法

public static int binarySearch(Object[] a, Object key) 
Run Code Online (Sandbox Code Playgroud)

在其实现中的Arrays类导航通过abinarySearch算法之后的数组参数,并将ainto 的元素转换为Comparableinvokes,compareTo(key)直到它找到匹配或耗尽可能性.

然而,我对实现感到困惑,如果是这种情况,方法将始终将元素强制转换为Comparable,并且ClassCastException如果它遇到未实现的元素,则会抛出一个,如果ComparableAPI用户不熟悉该方法将只考虑数组元素的比较器,而不是密钥的比较器,通过防止在数组类型与Comparable不兼容的情况下进行调用的编译更加万无一失,并且如果执行调用也更有效该方法定义为

public static int binarySearch(Comparable[] a, Object key) 
Run Code Online (Sandbox Code Playgroud)

?将第一个参数定义为Object数组有什么好处?

编辑我在发布问题之后才看到这个问题并且已经回答但是这里有一个相关的帖子:为什么Arrays.sort采用Object []而不是Comparable []?他们声明,如果方法采用参数(Comparable [],Object),就不可能将Object []类型的数组传递给该方法,而不需要"重新分配",这也很昂贵.

java arrays comparable

6
推荐指数
1
解决办法
326
查看次数