2009-11-23 22 views
5

私が必要とするのは、条件に続いてタイプ(オブジェクトなし、キャスティングなし)を返すことができるメソッドです。ここでは一例です:charは文字で来た場合C#、動的戻り型

??? right (string fullStr, int endPosition) 
{ 
string tmpStr = ""; 

tmpStr = fullStr.Substring(endPosition); 

if(tmpStr.Length == 1) 
    return tmpStr[0]; //return a char!! 
else 
    return tmpStr; //return a string!! 
} 

返された、文字列が文字列になった場合は、返されました(私は、ジェネリックを試みたが、私だけで来ていた型を返すことができました)。 は、私はこれを試してみました:

public static T right<T>(T stringToCheck, int endPosition) 
    { 
     if (typeof(T).ToString() == "System.String") 
     { 
      string fullString = (string)((object)stringToCheck); 
      string response = ""; 

      response = fullString.Substring(endPosition); 

      if (response.Length == 1) 
      { 

       return (T)((object)response[0]); 
      } 
      else 
       return (T)((object)response); 
     } 

     return stringToCheck; 
    } 

私は(オブジェクトを返す)型キャストを使用することはできません、REF paramsはを使用傾けます。方法へ

の呼び出しは同じ滞在する必要があります:

right(stringOrChar,int) -> returns string or char. 

は、私はそれは理論的には可能だとは思わないあなたに

+0

たぶん、あなたは私たちを助けることができます。なぜあなたは複数の戻り値の型を持ちたいのですか?なぜあなたは文字をいくつかの状況で、文字列を他のものにしたいのですか? – McKay

+0

私がこの種の必要性を感じる理由は、コードの移植が多いためです。構文は主に互換性がありますが、 "left(str、1) Enriquev

答えて

7

関数の戻り値の型を入力する必要があります。他の変数や演算と同様に、指定された型から継承する型はすべて有効な戻り値です(そのため、objectは何でも値として許可します)。

発信者の物流はあまり意味がありません。あなたの変数にcharまたはstringのように変数を入力するかどうかはどうでしょうか?

いずれの場合もstringを返すことができない特別な理由はありますか?

11

ありがとうございます。あなたはC#4で "ダイナミック"を使うことができますが、もしあなたがまだそこにいなければ、それをすることはできません。

文字列または文字のいずれかを返すことができた場合は、両方のオブジェクトが降りてくるオブジェクトである必要があります。そのうちの「オブジェクト」が唯一の選択肢です。そして、キャストをする必要があります。

C#(3.5以前のバージョン)は、メソッドの単一の戻り値の型が何であるかを知る必要があるため、呼び出し元メソッドのチェックを行うことができます。実際、C#4では、「ダイナミック」と言うと、実際には「オブジェクト」が下にあります。

あなたは、両方の

public class StringOrChar 
{ 
    char charValue; 
    string stringValue; 
    bool isString; 
} 

を持っている。しかし、それは場しのぎのカスタムクラス/構造体を作成することができます。

なぜ異なる返品タイプを使用したいのですか?

2

outパラメータを使用できます。両方のバリエーションを含む型を返すことができます。

1

方法のみができます - 私の知る限りでは - ので、あなたのデザインが、この苦境にあなたを余儀なくされた場合、そこに可能性があります、オブジェクトとキャストがしかし、論理的な代替

で返す1種類

を返しますそれに欠陥がある。おそらくいくつかの詳細は、私たちはあなたに

ノートを助けることができます:

string right(string fullStr, int endPosition, out bool oneChar) 
{ 
    string result = fullStr.Substring(endPosition); 
    oneChar = result.Length == 1; 
    return result; 
} 
+10

Jon Skeetはキーボードのシフトキーとピリオドも持っています。 –

+0

@ [Robert Harvey]:Jon Skeetはキーボードを必要としません。彼はGoogle UKの直接的な神経インターフェースを提供しています。もしあなたが気になることがあれば、気軽に編集してください。 ;-) –

0

から免疫がありますか?

/// <summary> 
/// Emulates VB Right Function 
/// Returns a string containing a specified number of characters from the right side of a string. 
/// </summary> 
/// <param name="s"></param> 
/// <param name="length">The number of characters to return.</param> 
/// <returns> 
/// The right <paramref name="length"/> number of characters from the string. 
/// If the string has less than or equal to <paramref name="length"/> number of characters, 
/// an empty string is returned. 
/// </returns> 
public static string Right(this string s, int length) 
{ 
    return length > s.Length ? string.Empty : s.Substring(s.Length - length); 
} 

このメソッドを呼び出すときに、あなたができる:

string myString = "Test String"; 
string returnedString = mystring.Right(1); 
char? myChar = returnedString.Length == 1 ? returnedString[0] : null; 
bool isReturnValueAChar = myChar.HasValue; 
-1

は、あなたがこれを行うにしようとしています:JONのスキートは、すべてのそのような制限は何これについて

2

が "< 'X'(、1 STR)左" のたくさんあるが、それは単にABC =左である他の回(str、3)

この場合、1文字の文字列を返すことができます。文字列の比較は辞書順に行われるので、ここではcharを使用する必要は特にありません(当然のことながら、元の作者は文字列とは異なる文字を扱うために多相性を使用していました)。

0

Enriquev、

VBAから構文を変更することなく、を実装する方法がありません。あなたは何を望むか戻り値の型を指定できますが、これは本質的

public static U right<T, U>(T input, int index) 
{ 
... 
return (U)returnVariable; 
} 

私は本当にこれはあなたの問題を解決しないと思う...キャストされます。

一重引用符で囲まれたすべての1文字を正規表現に置き換えることはできますか?これは、文字を文字列にし、比較演算子が動作するようにします。

0

この動作するはずです:

public static dynamic right(string fullStr, int endPosition) 
    { 
     string tmpStr = ""; 

     tmpStr = fullStr.Substring(endPosition); 

     if (tmpStr.Length == 1) 
      return tmpStr[0]; //return a char!! 
     else 
      return tmpStr; //return a string!! 
    } 

テストを、このコード:

static void Main(string[] args) 
    { 
     var str = right("Hello", 3); 
     Console.WriteLine(str.GetType()); // System.String 

     var ch = right("Hello", 4); 
     Console.WriteLine(ch.GetType()); // System.Char 
    }