スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

凝り過ぎるのもバグの元ってか

繰り返し文をLINQっぽくで書いたうちの2つのメソッド
using System;
using System.Collections;
using System.Collections.Generic;

namespace Jp.TwWorks {

public static partial class Utils {

/// <summary>
/// 途中終了可能なforeach
/// </summary>
/// <param name="srcList">リスト</param>
/// <param name="action">メソッド</param>
public static void ForEach<T>(
IEnumerable<T> srcList,
Action<T> action) {
if (srcList == null) {
return;
}

foreach (T element in srcList) {
action(element);
}

return;
}

/// <summary>
/// 途中終了可能なforeach(break機能追加)
/// </summary>
/// <param name="srcList">リスト</param>
/// <param name="action">メソッド</param>
public static void ForEach<T>(
IEnumerable<T> srcList,
Func<T, bool> action) {
if (srcList == null) {
return;
}

foreach (T element in srcList) {
if (!action(element)) {
break;
}
}

return;
}
}
}
これを利用するとき、ある特定の書き方をすると、ループしないことがわかった。
class Class1 {

public Class1() {
BoolProp = true;
return;
}

public bool BoolProp {
get; set;
}
}

var list = new List<Class1>() {new Class1(), new Class1(), new Class1()};
Utils.ForEach(list, element => element.BoolProp = false);

ビルドは通る。
実行も例外なく終了する。
しかし、falseになるのは最初の1つだけである。自分的には戻り値無しのActionのつもりで渡していたのだけれど、コンパイラは、代入した後にそのプロパティ値を返すFuncと認識している。ループさせる事を想定しているんのに、ループしない。そんな意図しない動きになっていた。うん。こんな事が起きるくらいなら、引数がActionの方だけで良いな。凝りすぎるのも考えものだ(ーー;。

スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。