
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelでnullになるような式のセルをマクロで空白行と認識させるにはどうすればいいですか? 3 2023/03/13 13:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コールバック関数はnullになら...
-
構造体のリスト削除
-
「Aに対するBの割合」と「Aに対...
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
Aの値からBの値を除するとは??
-
Enterキーを押されたら次の処理...
-
DWORDの実際の型は何でしょうか
-
プログラムでの数字につく”f”の...
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
有効数字について 以前質問をし...
-
エクセルで可視セルにのみ値貼...
-
10個出力で改行したいのですが...
-
2÷3などの余りについて
-
Excelで1つしかない値だけを抽...
-
構文エラー";"が型の前にあり...
-
*をユーザーが入力した数字の数...
-
「指定されたキャストは有効で...
-
c languageで 簡単な質問があ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のリスト削除
-
コールバック関数はnullになら...
-
InvokeMemberメソッドとは何を...
-
C# ref引数のnull判定
-
双方向リストのバブルソートに...
-
C#でのEXCEL出力に関して
-
プログラミング(C#)のエラーに...
-
if文でゼロとNULLを除外するた...
-
PLSQLについて
-
バブルソートを使って文字列を...
-
【C++】ストリームオブジェクト...
-
SQLのIN関数に関して
-
文字列の結合方法(SQL)
-
ばばぬきプログラムについて
-
今度はdoubly linked listの問...
-
API 録音 MCI
-
大学で出されたc言語の課題に...
-
C言語
-
isset — 変数が宣言されている...
-
Aの値からBの値を除するとは??
おすすめ情報