簡體   English   中英

有沒有一種方法可以在C#中實現“ void func(out params object []參數)”

[英]Is there a way to implement “void func(out params object[] parameters)” in C#

我想做的是能夠將任意數量的變量傳遞到函數中,在函數內部操縱這些變量,並能夠訪問函數范圍之外的那些操縱。

void FunctionA()
{
    int x = 1;
    string s = "blah";
    int y = 4;
    FunctionB(out x, out s, out y);
    Console.WriteLine("{0}, {1}, {2}", x, s, y);
}
void FunctionB(out params object[] parameters)
{
    for(int ii = 0; ii < parameters.Length; ii++)
    {
        if(parameters[ii] is int) parameters[ii] = (int)parameters[ii] + 1;
    }
}

調用FunctionA()之后,控制台上應顯示“ 2,blah,5”。 有沒有一種方法可以做到這一點,只需返回一個object []並解析出我想要的變量?

為了澄清起見,這是我正在嘗試做的事情。 將byte []與一系列變量一起傳遞給函數。 嘗試從byte []中讀取信息,並將其分配給傳入的變量。因此,如果我有一個int,一個字符串和另一個寫入int byte []的int,則我輸入類似以下內容:

int x, y;
string s;
byte[] info = ...;
FunctionB(info, x, s, y);
Console.WriteLine("{0}, {1}, {2}", x, s, y);

它將從byte []輸出信息。

不,你不能。

在這里,您只有一個out參數,而您想要多個單獨的 out參數。 C#不支持通過params ...,並且params是獲取數量可變的參數的唯一方法,除非您希望將其重載到要支持的最大參數數量。

params將始終將參數的復制到新數組中。 那時它們已與原始變量分離。

確定要出門嗎? 你能給我們真實的代碼嗎? 根據我對您發布的內容的了解,這是可行的...

void Main()
{
    object [] f = new object []{ 1, "blah", 4 };
    Test( f );
    Console.WriteLine("{0}, {1}, {2}", f[0], f[1], f[2]);
    // output
    // 2, blah, 5 

}

void Test ( object[] parameters )
{
    for(int ii = 0; ii < parameters.Length; ii++)
    {
        if(parameters[ii] is int) 
            parameters[ii] = (int)parameters[ii] + 1;
    }
}

請注意,您的“澄清”與您最初提出的問題大不相同。 聽起來您正在嘗試編寫反序列化代碼。 首先,請閱讀MSDN序列化文檔,以了解有關.NET可以提供的功能的更多信息。 如果在特定情況下創建自我反序列化對象是過大的,則應考慮使用BinaryReader讀取數據:

byte[] info...
int x;
string s;
int y;

using (BinaryReader reader = new BinaryReader(new MemoryStream(info)))
{
    x = reader.ReadInt32();
    s = reader.ReadString();
    y = reader.ReadInt32();
}

請注意,如果您的數據編碼與BinaryReader期望的不匹配,則可能必須在BinaryReader.ReadeByte()之上構建自己的函數。 還要注意,從緩沖區填充“大量變量”的函數有一些代碼氣味……肯定這些變量以某種方式相關,並且您有機會定義一個表示(表示反序列化器)的類。不管那個概念是什么。

為什么 C# Func<int> 不能分配給 Func<object> ?<div id="text_translate"><p> 我在 C# 研究了協變和逆變。下面我的代碼有一個錯誤。</p><pre> object a = new object(); int b = 10; a = b; // not error Func<object> acO = () => new object(); Func<int> acI = () => 1; acO = acI; // error</pre><p> 錯誤信息:</p><blockquote><p> 無法將類型“System.Func”隱式轉換為類型“System.Func”。</p></blockquote><p> 我認為如果 int -> object 是可能的,那么 Func -> Func 將是可能的。 但事實並非如此。</p><p> 我認為值類型在返回時將被復制以使用,這與引用類型(對象)不同,並且它可能導致意外操作(如異常)。 我的猜測正確嗎?</p><p> 我期待着您明智的回答。 感謝您閱讀。</p></div></object></int>

[英]Why C# Func<int> cannot be assigned to Func<object>?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM