2011-08-18 12 views
19

as operatorのドキュメントによれば、as "は、互換性のある参照タイプ間で特定のタイプの変換を実行するために使用されます"。 Nullable is actually a value type以来、私はasが動作しないことを期待しています。ただし、このコードはコンパイルされて実行されます。Nullable <T>でas演算子を使用できるのはなぜですか?

object o = 7; 
int i = o as int? ?? -1; 
Console.WriteLine(i); // output: 7 

この動作は正しいですか? asのドキュメントは間違っていますか?何か不足していますか?

+3

Nullable は値型ですが、私はあなたのテキストを修正しました。 –

+0

@Matthew:ありがとう。それはかなり混乱したタイプミスでした。 – recursive

+1

AS/ISとNullablesに関する素晴らしいディスカッション - http://stackoverflow.com/questions/1583050/performance-surprise-with-as-and-nullable-types – sll

答えて

21

この動作は正しいですか?

はい。

ドキュメントは間違っていますか?

はい。私はドキュメンテーションマネージャに知らせました。これを私の注意を喚起してくれてありがとうと、エラーのためにお詫び申し上げます。明らかに、C#2.0では、ヌル入力可能な型が言語に追加されたときにこのページを更新する人はいなかった。

何か不足していますか?

MSDNのドキュメントではなく、実際のC#の仕様を読むことをお勧めします。それはより決定的です。

2

読んだ:

注意として、オペレータが参考変換およびボクシング変換を実行します。 as演算子は、ユーザー定義の変換などの他の変換は実行できません。変換はキャスト式を使用して実行する必要があります。

とボクシングの変換.....ただの推測

+0

しかし、これはちょうど普通の ' int '、 '' as' 'のターゲットです。 – recursive

+0

なぜintと思う?この問題の観点からは別の方法で管理する必要がありますか? – Tigran

+0

私はそれがなぜ違うのか分かりません。ある意味では、それは私が求めていることに関連しています。 – recursive

1

が、私はそれを整数としてOボックスを言った後、NULL可能に変換したいです。

+1

ほぼ。それが整数であればオブジェクトを整数としてunbox *し、それをnullに変換します。アンボクシングが失敗した場合、結果はnull null可能なintです。 –

0

参照型であるオブジェクトに 'as'を適用しています。 nullの場合があります。この場合、CLRには、nullの値型に参照 'null'をアンボックスする特別なサポートがあります。この特殊なボックス解除は、他の値型ではサポートされていないため、Nullableが値型であっても、特殊な権限があります。

1

などのキーワードについてのドキュメントから:

発現が一度だけ評価される以外には、以下の式と同等です。

表現はタイプですか? (タイプ)の式:用(タイプ)ヌル

参照使用はまた、しかし、あなたはまた、このようなものを行うことができ、それは参照型で動作述べている:私は

int? temp = null; 
if (temp is int?) 
{ 
    // Do something 
} 

を参照型ではなく、参照型ではなくnullable(nullable型または参照型)である必要があるという点で、参照ドキュメントでは不正確です。

1

明らかに、as operatorのMSDNドキュメントを更新する必要があります。

object o = 7; 
int i = o as **int** ?? -1; 
Console.WriteLine(i); 

あなたは私たちが値をint型と同様に、演算子を使用し、次のコードをしようとした場合、あなたは適切なコンパイラエラーメッセージが表示されます

ザ・オペレーターとして参照型で使用しなければならないということかNULL可能タイプ(「intは」非NULL可能値型である)

引用コミュニティコンテンツセクションでthe linkにかかわらず、アップデートがあります:

は、
The as operator must be used with a reference type or nullable type. 
関連する問題