dポイントプレゼントキャンペーン実施中!

C# ref引数のnull判定
こんにちは。

以下のような関数なのですが、

void func(ref uint arg)
{
・・・・・
}

argがnullかどうかを判断するにはどうすればよいのでしょうか?
プラグインを作成していまして、funcは既存のインターフェースの実装なのですが、呼び出し側でargにnullを入れるケースがあり、判断する方法がわからすに困っています。

試しに
if( arg != null )
{
....
}
としてみましたが、「型'uint'の値が型'uint?'の'null'に等しくなることはないので、式の結果は常に'true'になります。」
というwarningが出てしまい、判定できませんでした。

A 回答 (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
となります。
----------------------
    • good
    • 0

そのref uintで渡されてくる値型オブジェクトがnull許容型になっているということはないですか?


null許容型なら、以下のような方法でnull判定ができますが、引数でそうなっている場合に該当するのかはわかりません。

if(arg.HasValue == true)
{
}

null許容型で調べると、いろいろ面倒くさそうな情報がでてきます。参考になれば・・・

この回答への補足

回答ありがとうございます。
どうやらnull許容型とは別の話のようです。
null許容型の場合、
uint? a=null;
といったことが可能になるわけですが、これはaの値がnullであるということですよね。

今回の場合、argの値ではなく、argの格納場所がnullになってしまっているわけです。
確かにC#だけで組んでいる場合には起こり得ない状況なわけで、本来C++であるCOMを半ば強引にC#で実装することに起因する問題であるように思えます。
と考えると、C#の側でチェックすることは無理なのかなという感じがしています。

unsafeコードでargのポインタ取ってみれ判別できるのかもしれません。

補足日時:2010/05/25 17:49
    • good
    • 0

コンパイラの警告の通りですが・・・


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 …

例外をトラップするしかないのかな。

補足日時:2010/05/25 09:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!