
C# ref引数のnull判定
こんにちは。
以下のような関数なのですが、
void func(ref uint arg)
{
・・・・・
}
argがnullかどうかを判断するにはどうすればよいのでしょうか?
プラグインを作成していまして、funcは既存のインターフェースの実装なのですが、呼び出し側でargにnullを入れるケースがあり、判断する方法がわからすに困っています。
試しに
if( arg != null )
{
....
}
としてみましたが、「型'uint'の値が型'uint?'の'null'に等しくなることはないので、式の結果は常に'true'になります。」
というwarningが出てしまい、判定できませんでした。

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
となります。
----------------------
No.2
- 回答日時:
その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のポインタ取ってみれ判別できるのかもしれません。
No.1
- 回答日時:
コンパイラの警告の通りですが・・・
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 …
例外をトラップするしかないのかな。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コールバック関数はnullになら...
-
構造体のリスト削除
-
Enterキーを押されたら次の処理...
-
Aの値からBの値を除するとは??
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
「Aに対するBの割合」と「Aに対...
-
エクセルで可視セルにのみ値貼...
-
ある商品のロス率を5%見込み、...
-
fgetsなどのときのstdinのバッ...
-
DWORDの実際の型は何でしょうか
-
構文エラー";"が型の前にあり...
-
2÷3などの余りについて
-
#define _CRT_SECURE_NO_WARNIN...
-
マイナスからプラスへ転じた時...
-
【C言語】全角文字の配列を、全...
-
「指定されたキャストは有効で...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
プログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報