簡體   English   中英

通過C#中的Action傳遞結構體無法編譯

[英]Passing a struct via an Action in C# does not compile

我有一個可以正常工作和編譯的代碼,其中的Action定義為:

Action<double, double, double ....> OnBlah;

現在我有16個以上的參數,因此我想傳遞一個結構,因此將操作定義為:

Action<structName> OnBlah;

但是我在C#編譯器中收到一條錯誤消息,提示未初始化structName。 這很奇怪,因為:

答:以前在代碼中,我直接從結構傳遞了OnBlah的double參數。

B.結構通過定義初始化。

我正在使用VS 2010,我猜這是編譯器錯誤嗎?

為編譯器錯誤添加了復制代碼:

namespace CompilerBug
{
    struct Test
    {
        public double a;
    }

    class Program
    {
        static Action<Test> OnBlah;

        static void DoesCompileOk()
        {
            Test test;
            test.a = 5;
            OnBlah(test);
        }

        static void DoesNotCompileOk()
        {
            Test test;
            int b = 0;
            if (b == 4)
            {
                test.a = 5;
            }
            OnBlah(test);
        }

        static void Main(string[] args)
        {
            OnBlah = (t) => { };
        }
    }
}

這不是編譯器錯誤。 您需要先初始化結構,如編譯器所說。 大概您的錯誤實際上在調用委托的代碼中,因為沒有其他意義。

當您使用16參數double版本調用委托時,double參數已初始化。 如果尚未初始化它們,則編譯器將發出相同的錯誤。 例如:

private static void actDouble(double d)
{
}

static void Main(string[] args)
{
    double d;
    Action<double> act = actDouble;
    act(d);//error on this line
}

無法編譯,並出現以下錯誤:

error CS0165: Use of unassigned local variable 'd'

在這方面,結構沒有什么特別的。

通常,遇到語法錯誤時,您的第一個猜測永遠不應是這是編譯器錯誤。 編譯器錯誤極為罕見,尤其是在像這樣廣泛使用的編譯器中。


在對添加了真實代碼的問題進行編輯之后進行更新

Test test;
int b = 0;
if (b == 4)
{
    test.a = 5;
}
OnBlah(test);

編譯器不確定test是否已完全初始化。 它不執行程序流分析。 您可以通過確保編譯器知道該結構已完全初始化來解決此問題。

Action<structName> OnBlah;

永遠不會提出您引用的錯誤; 如果無法解析ActionstructName這兩種類型中的任何一種,則會抱怨-如果通用類型參數不合適,則會抱怨,但這是預期的。

如果OnBlah是一個字段,它將自動初始化為null;否則,它將自動初始化為null。 如果是變量 ,則需要在使用前進行分配。 可以將其分配為null ,但是如果是這樣,則在嘗試調用它時會在運行時失敗(除非您執行null檢查)。 於是我們來調用; 如果我們假設非空,則需要提供一個參數,即

OnBlah(someValue); // or OnBlah.Invoke(someValue);

在這里,如果未定義 someValue ,則會出錯; 如果未明確分配 ,它將出錯。 對於確定的分配,將分配字段 除非初始化,否則不會變量。

在結構中的情況下,一個值是由使用構造(或返回值的另一種方法) 或者初始化, 通過手動設置場(這不應該是可能的,因為一個:結構應該是不可變的,和b:字段應為私有)。

暫無
暫無

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

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