いいえ、できません。
簡単な回避策は、拡張メソッドを使用することです。
public static string IfNullOrEmpty(this string instance, string alt){
return string.IsNullOrEmpty(instance) ? alt : instance;
}
var str1 = "".IfNullOrEmpty("foo"); //'foo'
var str2 = ((string)null).IfNullOrEmpty("bar"); //'bar'
var str3 = "Not null or empty".IfNullOrEmpty("not used"); //'not null or empty'
ただし、拡張メソッドがファーストクラスのコンパイル時定数に表示されるようにするには、その拡張メソッドを;""
にマージする必要があることに注意してください。System
すなわち:
namespace System {
public static class MyStringExtensions {
// method here
}
}
これをしないでください-ただし、キックのためだけです
お勧めはしませString
んが、暗黙のキャスト演算子を含むラッパー型を作成して、文字列が空の場合string
に返すこともできます。したがって、その型のインスタンスで演算子を使用すると、正しい動作が得られます。null
??
public class FakeString
{
private string _source;
public FakeString(string source)
{
}
public static implicit operator string(FakeString instance)
{
return string.IsNullOrEmpty(instance._source) ? null : instance._source;
}
public static implicit operator FakeString(string source)
{
return new FakeString(source);
}
}
[TestMethod]
public void Test()
{
FakeString fs = "";
string result = (string)fs ?? "foo";
Assert.AreEqual("foo", result);
}
しかし、ご覧のとおり、キャストを使用して変換を開始する必要があり、実際にはかなり醜く恐ろしいので、そうしないでください。しかし、あなたはできます。 私はしません。
これ以上免責事項が必要ですか?
その明示的なキャストに関するちょっとしたメモ
私の大部分はうまくいくはずだと思っていstring result = fs ?? foo;
ましたが、うまくいきません。その理由は、null
によって実行されるチェックが??
左側の参照に対してのみ行われるためです。null 許容値型の場合を除いて、型に依存しません。IL を逆コンパイルすると、参照がスタックに読み込まれ、それが true または false に評価されるかどうかがチェックされます。コードはその時点で、スタックに値を読み込む 2 つのさらなる操作のいずれかに分岐します (ここで、FakeString
演算子その後、呼び出されます)。この動作は、null 許容値型の場合とは異なります。コンパイラはそれらを認識しているため、それに応じて動作を変更します。