解決済みの質問
質問:No.5918910
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数3
閲覧数429
C# ref引数のnull判定
C# ref引数のnull判定
こんにちは。

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

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

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

試しに
if( arg != null )
{
....
}
としてみましたが、「型'uint'の値が型'uint?'の'null'に等しくなることはないので、式の結果は常に'true'になります。」
というwarningが出てしまい、判定できませんでした。
投稿日時 - 2010-05-24 19:10:44
質問者が選んだベストアンサー
回答:No.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
となります。
----------------------
投稿日時 - 2010-05-25 22:58:31
この回答を支持する
(現在0人が支持しています)
この質問は役に立ちましたか?
4人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答
回答:No.2
そのref uintで渡されてくる値型オブジェクトがnull許容型になっているということはないですか?
null許容型なら、以下のような方法でnull判定ができますが、引数でそうなっている場合に該当するのかはわかりません。

if(arg.HasValue == true)
{
}

null許容型で調べると、いろいろ面倒くさそうな情報がでてきます。参考になれば・・・
投稿日時 - 2010-05-25 17:24:57
この回答を支持する
(現在0人が支持しています)
補足
回答ありがとうございます。
どうやらnull許容型とは別の話のようです。
null許容型の場合、
uint? a=null;
といったことが可能になるわけですが、これはaの値がnullであるということですよね。

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

unsafeコードでargのポインタ取ってみれ判別できるのかもしれません。
投稿日時 - 2010-05-25 17:49:59
回答:No.1
コンパイラの警告の通りですが・・・
ref uintと指定してあれば、仕組み上nullを渡す事自体ができません。なので、チェックすること自体が無駄だと言うことです。

これ以上は何をしたいのかわからないので、なんとも言えませんが・・・
(そもそも既存のインターフェイスは、何を想定したものなのか?呼び出し側でargにnullを入れるケースというのはどういう場合を想定しているのか?)

ちなみにrefではなくoutならばnullで渡せますが・・・

http://ufcpp.net/study/csharp/sp_ref.html
投稿日時 - 2010-05-24 21:10:31
この回答を支持する
(現在0人が支持しています)
補足
そうはいってもnullが来るんです。
本来はCOMのインターフェースで、ポインタ渡しです。
>何を想定したものなのか
想定じゃなくて現実の存在です。
具体的にはこれなんですが。
http://msdn.microsoft.com/en-US/library/bb161381(v=VS.80).aspx

例外をトラップするしかないのかな。
投稿日時 - 2010-05-25 09:26:43
もっと聞いてみる
関連するQ&Aはこちら
エクセルVBAでの質問です。 エクセルとして名前をつけて保存なら Sub aaa() Application.Dialogs(xlDialogSaveAs).Show ARG1:="ABC.x...
とほほのjavascriptで勉強しているのですが http://www.tohoho-web.com/js/function.htm 関数オブジェクトのfunc.arityのところ 関数が要求する...
void func( void )について 右側のvoidは引数がないという事は分かったのですが左側の voidの意味は「値を返さないreturn型に用いる」とあったのですが 値を返さないretur...
この他の関連するQ&Aをキーワードで探す
プログラミングのサブカテゴリ
[PR] おすすめの注目情報
カテゴリ:C・C++
RSS
-PR-
PR
-PR-