- ベストアンサー
C#のref引数でnull判定する方法は?
- C#のref引数でnull判定する方法を教えてください。
- 既存のインターフェースの実装で、ref引数にnullが入る場合、どのように判定すればいいですか?
- 「型'uint'の値が型'uint?'の'null'に等しくなることはないので、式の結果は常に'true'になります。」というwarningが出てしまい、判定できません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問者様から提示されたURLを見ると、C#の ref uint はC++では DWORD*となっていますね。 であれば、 unsafe void func (....途中省略..., unt *arg) として そこでargがnullかどうか判定されてはいかがでしょうか。 上記のサンプルコードです。 ---------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { unsafe static int sub(uint *data) { if (data == null) { Console.WriteLine("data=null"); } else { Console.WriteLine("data!=null"); } return 1; } static int sub(ref uint data) { Console.WriteLine("ref参照"); return 1; } static void Main(string[] args) { uint a=9; sub(ref a); unsafe { uint *p = null; sub(p); } } } } ------------------------ 実行結果は ref参照 data=null となります。 ----------------------
その他の回答 (2)
- reset_cat
- ベストアンサー率68% (94/138)
そのref uintで渡されてくる値型オブジェクトがnull許容型になっているということはないですか? null許容型なら、以下のような方法でnull判定ができますが、引数でそうなっている場合に該当するのかはわかりません。 if(arg.HasValue == true) { } null許容型で調べると、いろいろ面倒くさそうな情報がでてきます。参考になれば・・・
- hoge_piyo
- ベストアンサー率57% (15/26)
コンパイラの警告の通りですが・・・ ref uintと指定してあれば、仕組み上nullを渡す事自体ができません。なので、チェックすること自体が無駄だと言うことです。 これ以上は何をしたいのかわからないので、なんとも言えませんが・・・ (そもそも既存のインターフェイスは、何を想定したものなのか?呼び出し側でargにnullを入れるケースというのはどういう場合を想定しているのか?) ちなみにrefではなくoutならばnullで渡せますが・・・ http://ufcpp.net/study/csharp/sp_ref.html
補足
そうはいってもnullが来るんです。 本来はCOMのインターフェースで、ポインタ渡しです。 >何を想定したものなのか 想定じゃなくて現実の存在です。 具体的にはこれなんですが。 http://msdn.microsoft.com/en-US/library/bb161381(v=VS.80).aspx 例外をトラップするしかないのかな。
補足
回答ありがとうございます。 どうやらnull許容型とは別の話のようです。 null許容型の場合、 uint? a=null; といったことが可能になるわけですが、これはaの値がnullであるということですよね。 今回の場合、argの値ではなく、argの格納場所がnullになってしまっているわけです。 確かにC#だけで組んでいる場合には起こり得ない状況なわけで、本来C++であるCOMを半ば強引にC#で実装することに起因する問題であるように思えます。 と考えると、C#の側でチェックすることは無理なのかなという感じがしています。 unsafeコードでargのポインタ取ってみれ判別できるのかもしれません。