2011-06-30 6 views
11

私はStringクラス(.NET4のようIsNullOrWhitespace) に追加機能を作成しようとしている。しかし、私は参照の問題を抱えている:C#3.5パーシャルクラス文字列IsNullOrWhiteSpace

エラー1「文字列」 'string'と 'geolis_export.Classes.String'のあいまいな参照です

私は拡張メソッドを作成したくありません。

private void tbCabineNum_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
    e.Handled = !e.Text.All(Char.IsNumber) || String.IsNullOrWhiteSpace(e.Text); 
} 

文字列部分:

public partial class String 
{ 
    public static bool IsNullOrWhiteSpace(string value) 
    { 
     if (value == null) return true; 
     return string.IsNullOrEmpty(value.Trim()); 
    } 
} 

Stringクラスのエキストラを作成することはできませんstring x = null;

使い方があれば、こののでクラッシュしますか? System名前空間にパーシャルを配置しようとしましたが、これは他のエラーを引き起こします。

StringからString2にも名前を変更すると問題が解決されます。しかし、これは私が欲しいものではありません。オリジナルのStringクラスのリファレンスがないからです。

+3

'これがあればクラッシュするので、 "文字列のx = NULL;"' - 最初にあなたの事実を確認してください。さらに、この文を盲目的に繰り返すと、あなたを助ける人の知性が侮られます。これは最初にテストするのが簡単でした。 – sehe

答えて

41

.NETフレームワークのstringクラスが部分的ではないため、このようにすることはできません。
代わりに、このように実際の拡張メソッドを使用します。使用方法は、このようなものだ

public static class StringExtensions 
{ 
    public static bool IsNullOrWhiteSpace(this string value) 
    { 
     if (value == null) return true; 
     return string.IsNullOrEmpty(value.Trim()); 
    } 
} 

:すべての拡張メソッドと同様に

string s = "test"; 
if(s.IsNullOrWhiteSpace()) 
    // s is null or whitespace 

、呼び出しはnull参照の例外が発生しません。文字列がnullの場合:

string s = null; 
if(s.IsNullOrWhiteSpace()) // no exception here 
    // s is null or whitespace 

この現象の理由は、コンパイラが翻訳するということです以下のILコードに相当するILコードにこのコード:

string s = null; 
if(StringExtensions.IsNullOrWhiteSpace(s)) 
    // s is null or whitespace 
+0

@Stinus:そうですね、その拡張メソッドは 'static'クラスに存在し、' static'メソッドしか持たなくてはなりませんでした。また、 'this String'パラメータをメソッドの最初の引数として受け入れる必要があります(' String'を拡張していると仮定します)。 – Yuck

+1

文字列がnullの場合はtrueに戻らないはずですか?拡張メソッドとしての –

+0

+1は道のりです。 – TheBoyan

6

拡張メソッドは、静的クラス内部静的メソッドとして定義されなければなりません。パラメータにthisというキーワードがあることにも注意してください。

public static class MyExtensions 
{ 
    public static bool IsNullorWhitespace(this string input) 
    { 
     // perform logic 
    } 
} 

何がクラスにstaticを省略して行っていることは、したがって、あいまいなメッセージコンパイラから、あなたのアセンブリ内に競合するクラスを定義しています。

+0

+1は行く方法です。 – TheBoyan

0

拡張メソッドを作成するには、次の構文を使用する必要があります。 (キーワードthisの使用に注意してください):

public static bool IsNullOrWhiteSpace(this string value) 
2

stringクラスを部分として宣言されていない、あなたが代わりに拡張メソッドを記述する必要があります。

1
public static class MyExtensions 
{ 
    public static bool IsNullOrWhiteSpace(this string value) 
    { 
     if (value == null) return false; 
     return string.IsNullOrEmpty(value.Trim()); 
    } 
} 
0

これは、拡張方法の作成方法ではありません。クラスは部分クラスではなく、静的クラスでなければならず、名前は何でもかまいません(MyExtensionMethods)。また、拡張メソッドでパラメータを "this"でマークする必要があります。

これを試してみてください代わりに

public static class StringExtensions 
{ 
    public static bool IsNullOrWhiteSpace(this string value) 
    { 
     if (value == null) return true; 
     return string.IsNullOrEmpty(value.Trim()); 
    } 
}