2015-10-31 8 views
15

を上書きしますは、どのように私たちが知っている `is`オペレータ

int? number = 10; 
Console.WriteLine(number is int); // true 

しかし:

私はそれを行うことができますどのように私は text is stringリターン真たい
NotNull<string> text = "10"; // NotNull<> is my struct 
Console.WriteLine(text is string); // false 

、?

--------------------------------編集ここ

は私NOTNULLです:

public class NotNull<T> where T : class 
{ 
    public T Value { get; } 

    private NotNull(T value) 
    { 
     this.Value = value; 
    } 

    public static implicit operator T(NotNull<T> source) 
    { 
     return source.Value; 
    } 

    public static implicit explicit NotNull<T>(T value) 
    { 
     if (value == null) throw new ArgumentNullException(nameof(value)); 
     return new NotNull<T>(value); 
    } 
} 

クラスは以下のように宣言された場合:

public class A 
{ 
    public string B { get; set; } 
} 
01:

public class A 
{ 
    public NotNull<string> B { get; set; } 
} 

は、私はただのシリアライザは、同じことをシリアライズとデシリアライズすることを願って

--------------------------------編集2

これは不可能な質問です。

  1. がクラスの場合、default(NotNull<>)はnullです。何もしません。
  2. NotNull<>が構造体の場合、default(NotNull<>).Valueはnullです。

申し訳ありません。 MSDNで

+2

'is'はオーバーライド可能な演算子ではありません。あなたは 'NOTNULL 'は値型である場合は、あなたが防ぐことができないということを知っ 'デフォルトです、 – PetSerAl

+0

は答えにこれを作る@PetSerAl(他にはありません)ので、あなたはこれらの演算子が動作するようになった場合の質問はしても – Carsten

+1

を閉じることができます(NotNull ) 'が使用されていませんか?私はそれが主な理由のC#は内蔵のNotNull' 'のようなものを持っていないということ読んで思い出してください。あなたがそう重度の言語はかなり使えなくなること、それの有効な使用を制限しない限り、それだけで動作しないことができません。 – hvd

答えて

7

すでに指摘されているように、iscannot be overloadedです。あなたがnullでない文字列についてより多くの文脈を投稿すれば、おそらく他の解決策を見つけることができます。

is演算子は、NULL可能な型とその基になる型は、オーバーロードされているわけではなく、この動作が言語仕様で明示的に定義されているため動作します。 isを評価すると、NULL可能型は特別なケースとして扱われます。

is演算子の詳細な説明は、C#言語仕様のセクション7.10.10にあります。以下NULL可能タイプに関連する部分である:

Eが発現およびTで動作E is T、結果はタイプです(...

  • (...)

  • を:)次のようにDがEの動的タイプを表すさせ、そうでない場合

    •(...)

    •を次のように評価されますEの型がNULL可能型である場合、DはそのNULL可能型の基礎となる型です。演算の結果•

はDに依存し、Tは次のように

  • (...)

  • TがNULL可能タイプである場合、結果がもし真でありますTが非null許容値型である場合、Dは、D及びTは同じタイプである場合、結果が真である、T.

  • の基本タイプです。

16

あなたがオーバーロード演算子のリストがあります: Overloadable Operators (C# Programming Guide)

をこれらの演算子はオーバーロードできません。

=、、:?、??、 - >、=>、F (x)は、未チェック、デフォルトをチェックし、として、デリゲート、新しい、のsizeof、typeofの

+1

多分、私は過負荷を探しているのではなく、私の問題の解決策を探しています。 – Cologler

+10

は、あなたの質問に**「'is'演算子をオーバーライドする方法」**だったことを考えると、私は明確性の欠如のための負担のように感じるが、あなたにOPです。 – imallett

2

is演算子はオーバーライドオペレータ チェックではありませんこれはオーバーライド演算子の詳細を知るためにOperator Overloading Tutorial

+1

このリンクは質問に答えるかもしれないが、ここでは答えの重要な部分が含まれており、参考のためにリンクを提供することをお勧めします。リンクされたページが変更された場合、リンクのみの回答は無効になります。 – Teepeemm

+0

@Teepeemm okボス:P – moji

関連する問題