ジェネリックを使用して参照することにより構造体とのインタフェース、
-
19-09-2019 - |
質問
申し訳ありませんが、みんな!私はそのコードにしています!私は、コンパイルエラーを置くことを忘れてしまったこと。
ここでは簡略化されたコードの新しいバージョンです!
そして、これはエラーがあります:
「IWeird.DataBase.ModifyData(REF IWeird.IDataTable)」の最良のオーバーロードされたメソッドの試合1エラーは、いくつかの無効な引数を持ってい
エラー2引数 '1': 'にREFのIWeird.Periods' から変換することはできません 'REF IWeird.IDataTable'
問題: 私は、参照することによりその中の構造体との界面を通過することができません、 私が間違って何をやってんだ?
ここでは、新たなサンプルコードがあります:
class PeriodsProcessor
{
public PeriodsProcessor()
{
Periods Data = new Periods();
DataBase DB = new DataBase();
Console.WriteLine(Data.Value);
DB.ModifyData(ref Data);
Console.WriteLine(Data.Value);
Console.ReadLine();
}
}
public interface IDataTable
{
string Value { get; set; }
}
public struct Periods : IDataTable
{
public string Value { get; set; }
}
public class DataBase
{
public void ModifyData(ref IDataTable data)
{
data.Value = "CHANGE";
}
}
class Program
{
static void Main(string[] args)
{
PeriodsProcessor PeriodsProcessor = new PeriodsProcessor();
}
}
解決
問題がDB.ModifyData<Period>(Data);
メソッド呼び出しです。あなたのData
フィールドが構造体は値によって任意の方法のに渡され、構造体であるのたびにあなたが作成されたのコピーの構造体のメソッドを呼び出すことを意味し、メソッドに渡されます。だから、実際にあなたのModifyData
方法は、単にメソッド呼び出しの後に捨てられるPeriods
構造のコピーを変更されます。
他のヒント
あなたのコードでは、あなたがインターフェイスを実装する構造体を渡している、その中に構造体とのインターフェースを渡していません。これらは、2つの完全に異なるものです。あなたの問題を解決するためのように、私はすべての構造体を使用している理由が表示されていないので、私はクラスである期間を変更すると思います。
構造体の値型、ではありません参照型。あなたが参照することにより、それを渡したい場合は、ref
キーワードを使用する必要があるとしています。それはまだ値の型だといえ覚えておいてください、と別の変数に代入すると、新しい構造体を作成する予定です。