2011-10-07 32 views
1

私はこのコードを持っている:エラーメッセージ:「型 '文字列を変換できませんか?' 「文字列」に「

//Return null if the extension doesn't have the value, returns the value if it does. 
private T? getValue<T>(IEnumerable<Extension> extension, string attributeName) 
{ 
    IEnumerable<Extension> ext = extension.Where(e => e.attributeName == attributeName); 
    if (ext.Count() > 0) 
    { 
     return (T)ext.First().Attribute; 
    } 
    return null; 
} 

を私はそれが好きで呼んでいる:

//This works: 
retVal.byteValue= getValueFromExtension<byte>(u, "ByteToGet") ?? 0; 
//This doesn't work: 
getValueFromExtension<string>(u, "Text") ?? ""; 

私はコンパイルエラーが出ます:」エラーメッセージ:「型「文字列を変換できませんか? '

「「文字列」に、私は上記のコードで効果的にアイデアをどのように行うことができる新しい方法を作成せず?

それは??演算子、そう、もしヌルだ場合、私はチェックしてるような気がします文字列がnullの場合、常に空の文字列に設定されます。文字列の場合はどうしたらよいでしょうか?

上記のbyteValueはbyte型で、FYIはバイトではありません。

+2

このコードは、今までにコンパイルしていますか?私は 'T? 'と混乱しています。メソッドの戻り値型 – sll

+2

' getValueFromExtension'とは何ですか? – Oded

+4

あなたのメソッドが 'struct'制約なしでコンパイルされる理由を理解できません。 – CodesInChaos

答えて

6

数または類似の値型であれば、それは参照型と0ある場合はnullをしたいようです。 defaultキーワードを使用して、Tからそのような値を取得するだけです。また、拡張メソッドとして使用できるように、最初の引数にthisキーワードを追加することもできます。

private T getValue<T>(this IEnumerable<Extension> extension, string attributeName) 
{ 
    Extension ext = extension.SingleOrDefault(e => e.attributeName == attributeName); 

    if (ext != null) 
     return (T)ext.Attribute; 
    else 
     return default(T); 
} 
+1

値タイプのカスタムデフォルト値が必要な場合でも、次のようなものを使用することができます(「** byte?**」に注意してください): retVal.byteValue = getValueFromExtension (u、 "ByteToGet")?? 42;しかし、このような場合には、getValueメソッドにデフォルト値をもう1つの引数として渡す方が意味があります。 – SergGr

+0

@SergGr:とても良いです。私はこのメソッドのために別のオーバーロードを追加することしか考えられませんでした。 –

+0

StackOverflowは素晴らしく、すべての答えが私を助け、完全な答えを得るのに約5分かかりました。みんなありがとう。 – Dale

3

T?は、Nullable<T>を示します。これは、構造体に限定されているものです。文字列は構造体ではないため、 T?を受け入れるか返す方法で使用するのは適切ではありません。あなたはは値型と同様に(文字列など)のクラスについてnullを返したい場合

残念ながら、あなたは、単一の汎用的な方法でそれをサポートすることはできません。あなたは、default(T)のように、ではなく、の構造体ではNULLにならないようにするか、構造体の場合はという2つのメソッドをそれぞれ定義したり、2つのメソッドを定義する必要があります。

private T getValueForClass<T>(IEnumerable<Extension> extension, string attributeName) 
    where T : class 

private T? getValueForStruct<T>(IEnumerable<Extension> extension, string attributeName) 
    where T : struct 

... 

var theByte = getValueForStruct<byte>(extensions, "ByteToGet") ?? 0; 
var theString = getValueForClass<string>(extensions, "Text") ?? ""; 
+0

感謝します、ありがとう。私はそれについて考えなかった。 – Dale

+0

あなたの答えは良いです、私は答えとしてこれらの1つだけを受け入れることができるので、私が実際に使っているものを受け入れました。 – Dale

+0

@ user788402、それはいいです!常にあなたにとって有益なものを受け入れます。コインフリップも可能です。 –

2

null可能な文字列を使用することはできません。 Nullableのtypeパラメータは値型に制約され、Stringは参照型です。あなたのgetValueメソッドを使用すると、構造体にそれを制約する必要がある、とクラスのための別の方法を使用したいNULL可能T-を返します。

//Return null if the extension doesn't have the value, returns the value if it does. 
private T? getValue<T>(IEnumerable<Extension> extension, string attributeName) where T : struct 
{ 
    IEnumerable<Extension> ext = extension.Where(e => e.attributeName == attributeName); 
    if (ext.Count() > 0) 
    { 
     return (T)ext.First().Attribute; 
    } 
    return null; 
} 

//Return null if the extension doesn't have the value, returns the value if it does. 
private T getValueObject<T>(IEnumerable<Extension> extension, string attributeName) where T : class 
{ 
    IEnumerable<Extension> ext = extension.Where(e => e.attributeName == attributeName); 
    if (ext.Count() > 0) 
    { 
     return (T)ext.First().Attribute; 
    } 
    return null; 
} 

その後

//This works: 
getValue<Byte>(u, "ByteToGet") ?? 0; 

//This also works: 
getValueObject<String>(u, "Text") ?? String.Empty; 
関連する問題