2009-11-23 97 views
5

我需要的是一種方法,可以在條件之後返回一個類型(無對象,不允許強制轉型)。這裏有一個例子: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!! 
} 

我試圖仿製藥,但我只能返回一進去,(如果一個char進來一個char返回的類型,如果串進來一個字符串返回)。 我嘗試這樣做:

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 2009-11-23 19:26:11

+0

好吧,我需要這樣做的原因是因爲我移植了大量的代碼,語法大多是兼容的,但我必須知道它是否有可能這樣做,因爲有很多「left(str,1)<'x '',但其他時候它只是abc = left(str,3)。從字符到字符串似乎沒有明確的區別。這裏的目標是不要觸及代碼如果可能,但這不是因爲我不知道這是不可能的:-) – Enriquev 2009-11-23 19:46:27

回答

7

函數的返回類型必須鍵入。與任何其他變量或操作一樣,從指定類型繼承的任何類型都是有效的返回值(這就是爲什麼object允許任何值作爲值)。

調用者的物流沒有多大意義;你怎麼知道是否在你的例子中輸入你的變量爲charstring

是否有一個特殊的原因,在任何情況下都不能返回string

11

我不認爲這是理論上的可能。你可以在C#4中使用「動態」,但如果你還沒有在那裏,你不能這樣做。

如果它可以返回一個字符串或一個字符,那麼它必須是一個對象,它們都是從那裏下來的,其中「對象」是你唯一的選擇。然後你必須做演員。

C#(3.5和以前的版本)需要知道該方法的單一返回類型是什麼,以便它可以檢查調用方法。事實上,在C#4中,當你說「動態」時,它實際上使用了下面的「對象」。

您可以創建一個既有

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

一個自定義的類/結構,但它的缺憾。

爲什麼你想要有不同的返回類型?

2

您可以使用out參數。或返回包含這兩種變體的類型。

1

方法只能去 - 因爲我知道 - 返回一個類型

所以返回的對象和流延是合乎邏輯的替代

但是,請注意,如果你的設計,你不得不陷入這種困境,有可能成爲它的缺陷;也許一些更多的細節可以幫助我們來幫助你

注:喬恩斯基特都難從所有這些限制

+10

喬恩Skeet也有他的鍵盤上的shift鍵和句點。 – 2009-11-23 19:25:58

+0

@ [Robert Harvey]:Jon Skeet不需要鍵盤;他有谷歌英國的直接神經接口....如果e cummings困擾你,隨時編輯。 ;-) – 2009-11-23 20:40:02

0

這個怎麼樣:

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

你試圖做到這一點?

/// <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; 
2

有很多的 「左(STR,1)< 'X'」 但有時它只是ABC =左(str,3)

在這種特殊情況下,您可以返回一個單字符字符串。比較字符串按照字典順序進行操作,所以在這裏沒有特別的需要使用字符(當然,除非當初的作者使用多態性將字符與字符串區分開來,在這種情況下,您有我的同情心)。

0

Enriquev,

沒有落實未經VBA改變語法的方式。你可以指定你想要的返回類型,但這實際上是鑄造...

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

我真的不認爲這解決了你的問題。

是否有可能做一個正則表達式替換單引號包圍的所有單個字符?這將使字符變成字符串,並允許您的比較運算符工作。

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 
    }