elvis演算子(nullsafe逆参照演算子??)を含む式で拡張メソッドを呼び出すと、結果のnullが期待通りに拡張メソッドに渡されません。本質的に、予期しないヌル参照例外が発生する可能性があります。これを示すプログラムは次のとおりです。エルビス演算子(Nullsave Dereference Operator)がnull参照例外を引き起こしていますか?
class Program
{
static void Main(string[] args)
{
string nil = null;
foreach (var c in ((nil?.ToCharArray()).EmptyIfDefault())) { }; // works
foreach (var c in (nil?.ToCharArray().EmptyIfDefault())) { }; // nullref
}
}
public static class Utility
{
public static char[] EmptyIfDefault(this char[] target)
{
return target ?? new char[0];
}
}
この動作が仕様であれば、誰かがありますか?通知はありませんか? ToCharArray()とEmptyIfDefaultの間にあります。もしあれば、私は現在の行動を理解するだろう。今、バグのようです。 (これをマイクロソフトに報告する正しい方法は何ですか?)
同じ動作をする他の人には、余分な中かっこがそれを防止するようです。ところで
(:
それが関連している:ここで私は私は私の質問の中に下記の答えをちょうど含まれます:)
public static IEnumerable<TTarget> EmptyIfNull<TTarget>(this IEnumerable<TTarget> target)
{
return target ?? Enumerable.Empty<TTarget>();
}
編集を使用しています実際のEmptyIfNullです共通の落とし穴:これも
として解釈さvar txt = "I am " +
age>=18 ? "mature" : "not old" +
" enough.";
書き換えられたとき
var txt = "I am " +
age >= 18
? "mature"
: ("not old" + " enough.");
、括弧なしの行動は理にかなって:それは最初に直感的ですが
foreach(var c in
nil == null
? null
: nil.ToCharArray().EmptyIfDefault()) { }; // nullref
「elvis operator」はこれまで聞いたことがありませんでしたが、私はそれが好きです。 – Steve